私が持っている親ディレクトリの下のいくつかのディレクトリから多数のファイルを移動したいと思います。
バックティックで次のコマンドを使用します。
mv -t directory1/directory2/directory3/ `ls -R | grep _2_3`
そのため、バックティックのコマンドソースを現在のディレクトリ(親ディレクトリ)で繰り返し発見されるターゲットディレクトリ "directory3"に移動したいと思います。
現在のコマンドを使用してこれを行うことができるソリューションはありますか?このエラーは正確に何を意味しますか?
答え1
ls -R
出力が表示されます。ファイル名。つまり、出力はありません。パス名。したがって、名前にその文字列を含むファイルがサブディレクトリの1つに見つかった場合、_2_3
その文字列に関する情報はありません。どこls -R
ファイルは出力(ファイル名と同じ行)にあります。これによりコマンドが失敗します(現在のディレクトリにファイル名が見つかりません)。また、名前にスペース、タブ、または改行を含むすべてのファイルが失敗し、ファイル名にファイル名のワイルドカード文字が含まれていると奇妙な結果が生じる可能性があります。
代わりに、次のような名前のファイルを移動したいとします。終わり_2_3
ディレクトリに変更して/directory1/directory2/directory3
から(そのディレクトリは現在のディレクトリのサブディレクトリではありません)
find . -type f -name '*_2_3' -exec mv -t /directory1/directory2/directory3 {} +
そうします。これは_2_3
、名前が現在のディレクトリ内または下の任意の場所で終わるすべての一般的なファイル(ディレクトリ、名前付きパイプ、またはシンボリックリンクなどではない)のパス名を探し、これらのパス名をmv -t /directory1/directory2/directory3
できるだけバッチ処理します。
bash
シェルでは、次のこともできます。
shopt -s globstar
mv -t /directory1/directory2/directory3 -- **/*_2_3
パターンが何千もの名前に拡張されない限り。シェルglobstar
オプションはワイルドカードモードをbash
有効にします**
。同様に動作します*
が、一致します。通り過ぎる /
パス名に。したがって、*_2_3
現在のディレクトリまたはその下のどこにでも一致するすべての名前を見つけます。このコマンドは何も気にしません。タイプたとえば、名前が一致し、ディレクトリ名も一致します。ただし、使用するls -R
方法も一致します。
zsh
シェルでは、次のようにより正確に一致させることができます。
mv -t /directory1/directory2/directory3 -- **/*_2_3(.)
(.)
通常のファイルのみが一致するように前のパターンの動作を変更します。この**
モードはにありますzsh
。
同じ名前のファイルを探したい場合含む _2_3
、*_2_3
上記のコマンドでファイル名パターンのビットを*_2_3*
。
答え2
メッセージの重要な部分は次のとおりですNo such file or directory
。 ls -R
ファイルパスを含めないでください。だから mv
ファイル名だけがあり、パスがないので見つけることができません。
代わりにこれを行う:
$ find . -name '*_2_3*' -exec mv -t directory1/directory2/directory3/ {} +
ジョブ-exec … {} +
はfind
POSIX仕様ですが、mv -t
そうではありません。