あなたはとても親しかったです。
seq 15 -1 1 | xargs [email protected] sh -c 'mv @_* @'
*
の解釈 (展開) を遅らせる必要があります @
の後まで 置換が発生しました。 (しかし、それが問題であることはすでに理解していますよね?)
私は、不明なファイル名 (または他の置換文字列) をシェル コマンド ラインに直接埋め込まないようにアドバイスされています。上記の例は、文字列がどうなるかを知っているため、おそらくかなり安全です —15
、 14
, …, 3
、 2
そして 1
.しかし、上記の例をより複雑なコマンドのテンプレートとして使用することは危険です。より安全な取り決めは
seq 15 -1 1 | xargs [email protected] sh -c 'mv -- "$1"_* "$1"' x-sh @
どこで x-sh
呼び出されたシェルによって発行されたエラー メッセージにラベルを付けるために使用される半任意の文字列です。これは、文字列を埋め込むのではなく (@
で表される)、最初の例と同じです。 )シェル コマンドに直接、@
を指定して挿入します。 シェルへの引数として、それらを "$1"
として参照します .
追記seq
を実行することを提案しました コマンドの逆(seq 15 -1 1
15
を生成する 、 14
, …, 3
、 2
、 1
1
ではなく 、 2
、 3
, …, 14
、 15
)そして誰もそれについて言及しませんでした。ファイル名が 1foo.txt
のような場合、これは回答の重要な部分になります 、 2bar.asc
、および 13test.png
など (常に _
ではなく、数字の後にさまざまな文字が表示されます) )。その場合、コマンドは mv "$1"* "$1"
になります。 (_
なし) )、そして 1
を実行した場合 まず、コマンド mv 1* 1
すべての 10quick*
を一掃します 、 11brown*
、 12fox*
など、1foo*
とともにファイル ファイル。でも
seq 1 15 | xargs [email protected] sh -c 'mv -- "$1"_* "$1"' x-sh @
安全であるべきです。
P.P.S. seq
コマンドは POSIX で指定されていません。どちらもシェルでのブレース展開ではありません。 POSIX 準拠のソリューションは、この質問に対する grawity の回答と Adam Katz による別の回答を組み合わせることで構築できます。
i=1
while [ "$i" -le 15 ]
do
mv -- "${i}"_* "$i"
i=$((i+1))
done
P.P.P.S.ファイル名が英数字 (つまり文字と数字) で始まることがわかっている場合は重要ではありませんが、より一般的な場合は --
を使用する必要があります。 コマンド名と引数の間。これにより、ダッシュで始まるファイル名の処理が改善されます。 --
引数 (ファイル名) を として扱うようにコマンドに指示します 引数 これがないと、そのような引数はオプション文字列として扱われる可能性があります。
xargs
を使用しないでください そのために。 for
を使用 ループ:
for i in $(seq 1 15); do
mv ${i}_* $i
done
seq
の代わりにブレース展開を使用することをお勧めします :
mkdir {1..15}
for i in {1..15}; do
mv ${i}_* $i
done