あなたが探しているコマンドは
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