ディレクトリとそのサブディレクトリから別のディレクトリに再帰的に入力してファイルを移動するにはどうすればよいですか?


30

ディレクトリとそのすべてのサブディレクトリからファイルの種類を移動する良い方法は何でしょうか?

「/ thisdirのすべての* .oggを再帰的に/ somedirに移動する」のように。私はいくつかのことを試しました。私の最善の努力は(まだそれほど素晴らしいことではありませんでした):

find /thisdir -type f -name '*.ogg' -exec mv /somedir {} \;

各ファイル名の前の各行に返され、

mv: cannot overwrite non-directory `/thisdir/*.ogg' with directory `/somedir'

回答:


23

あなたはこれのためにxargsfindを使用できます

find /thisdir -type f -name "*.ogg" -print0 | xargs -0 -Imysongs mv -i mysongs /somedir

上記のコマンドの-Iは、使用する置換文字列をxargsに伝えます(それ以外の場合は、コマンドの最後に引数を追加します)。

または
、コマンドで、コマンドの後に「{}」を移動してみてくださいmv

find /thisdir -type f -name '*.ogg' -exec mv -i {} /somedir \;


1
上記のコマンドを試す前にバックアップを取ることを忘れないでください:-)。
ヘマント

2
ところで、ファイル名の問題の空白を回避するために、findの最初の-print0とxargsの-0を可能な限り使用する必要があります。
maxschlepzig

@maxschlepzig:良い点。編集します。
ヘマント

2
mv -iここで使用することを強くお勧めします。そのため、予期しないことが発生した場合にファイルを上書きするリスクはありません。
ジル「SO-悪であるのをやめる」

2
gnu core utilsのmv mv -t <targetdir>では、\の代わりにand を使用できます。


9

zshまたはbash 4では、すべての*.oggファイルを/somedir次の場所に収集します。

mv /thisdir/**/*.ogg /somedir

ディレクトリ階層を再現したい場合:(警告、ブラウザに直接入力)

rsync -a --prune-empty-dirs --include='*/' --include='*.ogg' --exclude='*' /thisdir /somedir

bashの便利さを超えて
マーク
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.