「test」という名前のすべてのフォルダーを見つけて、すべてのフォルダーをファイルとともに親フォルダーに移動する必要があります。
html/folder1/js/test -> html/folder1/test
html/folder2/js/test -> html/folder2/test
500以上のフォルダー
folder1
、folder2
などの親であるディレクトリのfor
ループ(この例ではhtml
ディレクトリ)でこれを行うことができるため、最初にcd
に(実際のパスに置き換えます:
cd /PATH/TO/html
このコマンドで、移動する名前がtest
でない場合は、test
を実際の名前に置き換えるか、*を使用してすべてを移動します。
for dir in ./* ; do mv "$dir"/*/test "$dir"/ ; done
これにより、現在の作業ディレクトリのサブディレクトリにあるtest
(およびディレクトリの場合はすべてのコンテンツ)という名前のすべてのものが親ディレクトリに移動しますが、サブサブディレクトリ自体は削除されません(したがってjs
あなたの例では、削除されません)
例:
前:
.
├── 15
│ └── Rainbow
│ ├── test
│ └── fun
後:
.
├── 15
│ ├── Rainbow
│ └── test
│ └── fun
コマンドは、この構造と一致するコンテンツを持つディレクトリ以外のすべてに対してエラーをスローしますが、それでも必要なことを実行します。したがって、これを無視するか、2>/dev/null
を追加してエラーを送信してください
for dir in ./* ; do mv "$dir"/*/test "$dir"/ ; done 2>/dev/null
find folder* -name 'test' -exec mv {} {}/../.. \;
find folder*
任意の./folder*
で検索します( globパターン Shellによって展開されます)
-name 'test'
名前がtest
のファイルの場合。
-exec mv {} {}/../.. \;
それらを2レベル上に移動します1。 {}
は、見つかった名前に置き換えられます。 -exec
オプションは、エスケープされたセミコロンで終了する必要があります。 echo
の前にmv
を追加すると、ドライランを実行できます。
1 なぜ2レベル上がるのですか?フォルダーをその親フォルダーに移動した場合、現在のスーパーフォルダーのサブフォルダーにするように依頼し、現在の場所に残るようにします。ただし、それを移動して、親の親のサブフォルダーになりたいです。展開されたコマンドは、mv folder1/js/test folder1/js/test/../..
のようになり、mv folder1/js/test folder1
に展開されます。
このコマンドを実行すると、次のような警告が発行されます。
find: ‘folder1/js/test’: No such file or directory
そのフォルダで検索しようとしているためafter移動されました。これは、2> /dev/null
を指定することで沈黙させることができます。