あなたが探しているコマンドは
mv * .[^.]* ..
または (詳細は以下を参照):
(shopt -s dotglob; mv -- * ..)
説明:mv
コマンドは、ファイルとディレクトリを移動します。 mv
の最後の引数 がターゲットです (この場合、ツリーの「1 つ上の」ディレクトリ ..
)。その前の引数は、ソース ファイルとディレクトリです。アスタリスク (*
) は、ドットで始まらないすべてのファイルに一致するワイルドカードです。ドットで始まるファイル (ドットファイル) は「非表示」です。それらはパターン .[^.]*
を使用して照合されます (以下の編集を参照)。
mv
の詳細については、リンクしたマンページを参照してください .
.[^.]*
の理由 .*
の代わりに ?
Chris Johnsen が正しく指摘しているように:パターン .*
.
にも一致します および ..
.それらを移動したくない (そして移動できない) ため、ドットで始まる任意のファイル名に一致するパターンを使用することをお勧めします これら 2 つを除く .パターン .[^.]*
まさにそれを行います:任意のファイル名 (1) で始まり、ドット (2) の後に not 以外の文字が続くものと一致します ドット (3) の後に 0 個以上の任意の文字が続きます。
Paggas が指摘するように、パターン .??*
も追加する必要があります。 2 つのドットで始まるファイルを一致させるため。 find
を使用した代替ソリューションについては、彼の回答を参照してください .
Arjan's answer は shopt
に言及しています ドットファイルに関するこれらすべての問題を回避するために。しかし、ダッシュで始まるファイルにはまだ問題があります。そして、3 つのコマンドが必要です。それでも、私はアイデアが好きです。次のように使用することを提案します:
(shopt -s dotglob; mv -- * ..)
これは shopt
を実行します サブシェルで (したがって、shopt
への 2 回目の呼び出しはありません) 必須)、--
を使用 ダッシュで始まるファイルが mv
の引数として解釈されないように .
簡単な答え:使用
find . -mindepth 1 -maxdepth 1 -exec mv -t.. -- {} +
長い答え:
コマンド
mv * .* ..
.*
以降は機能しません .
に一致 と ..
.しかし、コマンド
mv * .[^.]* ..
.[^.]*
であるため、これも機能しません。 一致しません。例:..filename
!代わりに、私がしていることは
mv * .[^.] .??* ..
.
以外のすべてに一致します そして ..
. *
.
で始まらないものすべてに一致します 、 .[^.]
..
を除く、ドットで始まる 2 文字のファイル名すべてに一致します 、および .??*
は、ドットで始まる 3 文字以上のすべてのファイル名に一致します。
さらに良いことに、使用できます
find . -mindepth 1 -maxdepth 1 -exec mv -t.. -- {} +
mv * .[^.] .??* ..
の見苦しい glob ハックを回避します !
完全を期すために、shopt
を使用して Bash シェルに隠しファイルを含めるように指示することもできます。 :
shopt -s dotglob
mv -- * ..
shopt -u dotglob