web-dev-qa-db-ja.com

多くのフォルダーとファイルを多くの親フォルダーに移動する

「test」という名前のすべてのフォルダーを見つけて、すべてのフォルダーをファイルとともに親フォルダーに移動する必要があります。

html/folder1/js/test -> html/folder1/test

html/folder2/js/test -> html/folder2/test

500以上のフォルダー

3
Paulo Rodrigues

folder1folder2などの親であるディレクトリの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
2
Zanna
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を指定することで沈黙させることができます。

2
Melebius