これが本当か偽なのか知りたいです。
ベストアンサー1
cp
単一のファイルを別のファイル名(たとえば、「名前変更」ターゲット)にコピーできますが、複数のファイルに異なるファイル名を指定することはできません。したがって、答えは「いいえ」です。cp
複数のファイルをコピーするときに名前を変更することはできません。
2つ以上の引数が与えられると、cp
すべてのファイルは最後の引数(ディレクトリ)にコピーされます。例えばcp file1 file2 file3 /path/to/destdir/
GNUには、ソースファイルの前にターゲットを指定できるオプションがcp
あります。例えば-t
--target-directory
cp -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
お気に入りのテキストエディタで編集し、newfile
各cp
コマンドラインからコピーされたファイルの名前を変更したい名前に変更します。一部のファイルの名前を変更したくない場合は、ターゲットのnewfile
場所からファイルを削除し、パスのみをターゲットの場所に保ちます。
'./foo'bar.txt'
ソースファイル名で出力の最後の行を参照してください。ファイル名に文字が含まれているため、その行は次のように含まれるように変更する'
ために追加の編集が必要です。'
'\''
cp './foo'\''bar.txt' '/path/to/dest/newfile'
sed
または、GNU(NUL行で区切りまたはオプションを使用)がある場合は、次のように-z
自動化できます。--null-data
xargs
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
。