現在のディレクトリから別のディレクトリにファイルを移動しようとしています。問題は、複数のファイルの名前に などの特殊文字が含まれていることですspace, ü, &, (, ...
。 などのコマンドを使用してすべてのファイルを移動するにはどうすればよいですか。ls | grep mp4 | xargs -i mv {} mp4
ここで{}
は現在のファイルの名前で、mp4 はすべてのファイルの保存先です。コマンドを試しましたが、エラーが表示されます。助けてもらえますか?
答え1
まさにこの状況だ使いたくないls
または、デフォルト設定では、スペースで入力を分割し、引用符とバックスラッシュを特別に処理します。この動作をオフにするには、ヌルバイトで入力を分割するか、改行 (GNU xargs) で分割するxargs
必要があります。-0
-d'\n'
すべてのファイルが同じディレクトリにあるため、シェルを使用するだけです。
mv *mp4* mp4/
または、拡張子が でmv *.mp4 mp4/
あるファイルのみを意味する場合。最初のものはへの移動について警告します。mp4
mp4
mp4
ファイルが同じディレクトリにない場合は、zsh
デフォルトで有効になっている二重星 ( - ) を使用するか、またはまたはksh
を使用する必要があります。set -o globstar
bash
shopt -s globstar
mv **/*mp4* mp4/
またはfind
find . -type f -name "*mp*" -exec mv {} mp4/ \;
答え2
コマンド:
ls | grep mp4 | xargs -i mv {} mp4
ほとんどの場合、よりシンプルで堅牢な次のものに置き換えることができます。
mv *mp4* mp4
ディレクトリ mp4 は内部では移動できないという警告は無視できます。
このスクリプトは、あなたのスクリプトと同様に、mp4
名前のどこかに「 」が含まれるすべてのファイルを移動します (例: mp4list.txt
、lamp4.jpg
)。実際に拡張子「.mp4
」を持つファイルのみを移動したい場合は、次を使用できます。
mv *.mp4 mp4
これにより、ディレクトリmp4
自体に関するエラー メッセージが発生する状況を防ぐことができます。
mp4 ファイルの数が多くて前述のコマンドが機能しない場合は、GNU を使用してfind
同じことを実現できます。
find . -maxdepth 1 -name "*mp4*" -exec mv -t mp4 {} +
または
find . -maxdepth 1 -name "*.mp4" -exec mv -t mp4 {} +