cpコマンドを使用して複数のファイルをコピーする場合は、コピー中にファイル名を変更できますか? [閉鎖]

cpコマンドを使用して複数のファイルをコピーする場合は、コピー中にファイル名を変更できますか? [閉鎖]

これが本当か偽なのか知りたいです。

ベストアンサー1

cp単一のファイルを別のファイル名(たとえば、「名前変更」ターゲット)にコピーできますが、複数のファイルに異なるファイル名を指定することはできません。したがって、答えは「いいえ」です。cp複数のファイルをコピーするときに名前を変更することはできません。

2つ以上の引数が与えられると、cpすべてのファイルは最後の引数(ディレクトリ)にコピーされます。例えばcp file1 file2 file3 /path/to/destdir/

GNUには、ソースファイルの前にターゲットを指定できるオプションがcpあります。例えば-t--target-directorycp -t /path/to/destdir/ file1 file2 file3

-t... | xargs cp -t destdir/たとえば、またはと一緒に使用するときに特に便利ですfind ... -exec cp -t destdir/ {} +

同じ別名オプションを含むmv他のGNUツールもあります。ln-t--target-directory


複数のファイルをコピーしながら名前を変更する場合は、最も簡単な方法はこれを行うスクリプトを作成することです。

ほとんどのスクリプトは自動的に生成できます。これを行う方法はいくつかあります。これは最も簡単な方法の1つです(ファイル名の一致を*.txt例にしてみましょう)。

find . -maxdepth 1 -name '*.txt' \
   -exec echo cp \'{}\' \'/path/to/dest/newfile\' \; > mycp.sh

file水平スクロールバーを避けるために、コマンドを2行に分割しましたが、1行にすべて入力できます。)

これにより、次のような出力が生成されます。

$ ls -1 *.txt
dict.txt
qstat.txt
x.txt
foo'bar.txt

$ find . . -maxdepth 1 -name '*.txt' \
  -exec echo cp \'{}\' \'/path/to/dest/newfile\' \;
cp './qstat.txt' '/path/to/dest/newfile'
cp './x.txt' '/path/to/dest/newfile'
cp './dict.txt' '/path/to/dest/newfile'
cp './foo'bar.txt' '/path/to/dest/newfile'

次に、mycp.shお気に入りのテキストエディタで編集し、newfilecpコマンドラインからコピーされたファイルの名前を変更したい名前に変更します。一部のファイルの名前を変更したくない場合は、ターゲットのnewfile場所からファイルを削除し、パスのみをターゲットの場所に保ちます。

'./foo'bar.txt'ソースファイル名で出力の最後の行を参照してください。ファイル名に文字が含まれているため、その行は次のように含まれるように変更する'ために追加の編集が必要です。''\''

cp './foo'\''bar.txt' '/path/to/dest/newfile'

sedまたは、GNU(NUL行で区切りまたはオプションを使用)がある場合は、次のように-z自動化できます。--null-dataxargs

find . -maxdepth 1 -name '*.txt' -print0 | 
    sed -z -e "s/'/'\\\''/g" | 
    xargs -0 -r -i echo cp \'{}\' \'/path/to/dest/newfile\' > mycp.sh

スクリプトの編集が完了したら、を使用して実行できますsh mycp.sh

おすすめ記事