最初と2番目の呼び出しは比較用です。出勤しようとするのは今回が3回目です。
$ ls -a1 *mp3
DaftPunk_VeridisQuo.mp3
French79_AfterParty.mp3
French79_BetweentheButtons.mp3
French79_Hometown.mp3
$ find . -maxdepth 1 -type f -name '*mp3'
./French79_AfterParty.mp3
./French79_Hometown.mp3
./DaftPunk_VeridisQuo.mp3
./French79_BetweentheButtons.mp3
$ for x in "$(ls -a *mp3)"; do mv "./$x" "./electro_$x"; done
mv: cannot stat './DaftPunk_VeridisQuo.mp3'$'\n''French79_AfterParty.mp3'$'\n''French79_BetweentheButtons.mp3'$'\n''French79_Hometown.mp3': No such file or directory
答え1
私は直接使用することを好みます。
for x in *.mp3
do
mv ./"$x" "electro_$x"
done
答え2
ちなみに、$(..)
Nトークンの代わりに1つのトークンを取得します。
いくつかのサンプルファイルから始めました。
$ ls
a.mp3 b.mp3 c.mp3
あなたのアプローチによれば、次の3行のうちの1つが表示されます。
for i in "$(ls *.mp3)"; do
echo "--> $i"
done
--> a.mp3 b.mp3 c.mp3
二重引用符を省略すると、$(...)
3 つの異なる出力行が表示されます。
for i in $(ls *.mp3); do
echo "--> $i"
done
--> a.mp3
--> b.mp3
--> c.mp3
ファイルにスペースが含まれている場合は、次のように問題を解決できます。 (この方法は現在のディレクトリのファイルにのみ適用されます。)
今後
$ ls
'DaftPunk VeridisQuo.mp3' 'French79 AfterParty.mp3' 'French79 BetweentheButtons.mp3' 'French79 Hometown.mp3'
名前の変更find
:
$ find *.mp3 -maxdepth 1 -type f -name *.mp3 -exec mv {} "electro_{}" \;
$ ls
'electro_DaftPunk VeridisQuo.mp3' 'electro_French79 AfterParty.mp3' 'electro_French79 BetweentheButtons.mp3' 'electro_French79 Hometown.mp3'
find *.mp3
単に提案するのではなく、提案するのはなぜですかfind . -type f -name '*.mp3' ...
?
$ find . -maxdepth 1 -type f -name '*.mp3' -exec mv {} "electro_{}" \;
mv: cannot move './French79 Hometown.mp3' to 'electro_./French79 Hometown.mp3': No such file or directory
mv: cannot move './French79 BetweentheButtons.mp3' to 'electro_./French79 BetweentheButtons.mp3': No such file or directory
mv: cannot move './French79 AfterParty.mp3' to 'electro_./French79 AfterParty.mp3': No such file or directory
mv: cannot move './DaftPunk VeridisQuo.mp3' to 'electro_./DaftPunk VeridisQuo.mp3': No such file or directory
答え3
あなたが望むものはPerlrename
ユーティリティ(別名prename
。file-rename
これはいいえrename
パッケージと同じユーティリティutil-linux
(完全に異なる互換性のないコマンドラインオプションと機能を含む)
努力する
rename -n 's/^/electro_/' *.mp3
この-n
オプションを使用すると実証的に実行されます。展示する許可した場合、.mp3ファイルの名前をどのように変更しますか?実際に名前を変更するには、削除するか、詳細な出力に-n
変更してください。-v
$ touch DaftPunk_VeridisQuo.mp3 French79_AfterParty.mp3 French79_BetweentheButtons.mp3
$ ls -l
total 2
-rw-r--r-- 1 cas cas 0 Oct 21 14:30 DaftPunk_VeridisQuo.mp3
-rw-r--r-- 1 cas cas 0 Oct 21 14:30 French79_AfterParty.mp3
-rw-r--r-- 1 cas cas 0 Oct 21 14:30 French79_BetweentheButtons.mp3
$ rename -v 's/^/electro_/' *.mp3
DaftPunk_VeridisQuo.mp3 renamed as electro_DaftPunk_VeridisQuo.mp3
French79_AfterParty.mp3 renamed as electro_French79_AfterParty.mp3
French79_BetweentheButtons.mp3 renamed as electro_French79_BetweentheButtons.mp3
$ ls -l
total 2
-rw-r--r-- 1 cas cas 0 Oct 21 14:30 electro_DaftPunk_VeridisQuo.mp3
-rw-r--r-- 1 cas cas 0 Oct 21 14:30 electro_French79_AfterParty.mp3
-rw-r--r-- 1 cas cas 0 Oct 21 14:30 electro_French79_BetweentheButtons.mp3
答え4
使用IFS区切り記号を設定します。改行文字を使用すると、スペースはもはや問題になりません。
IFS=$(echo -en "\n\b")
for x in $(ls -1 *.mp3); do mv "$x" "electro_${x}"; done
もちろん、単になぜならないのかと尋ねることもできます。
IFS='\n'
これは$()
、バックティックが末尾の改行文字を削除するコマンドの置換であるためです。
~からBASHマニュアル
\n改行文字
\ bバックスペースキー
私の理解は、「戻り」(左に移動)が末尾の改行が削除されるのを防ぎ、for
(各)ループを繰り返すことを可能にすることです。
これについては、以下でさらに詳しく説明します。一部 その他 スタックオーバーフロー 質問