lsが返したファイルを繰り返す方法

lsが返したファイルを繰り返す方法

最初と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ユーティリティ(別名prenamefile-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(各)ループを繰り返すことを可能にすることです。

これについては、以下でさらに詳しく説明します。一部 その他 スタックオーバーフロー 質問

関連情報