ファイル拡張子を変更するには、sed 行 (Linux ではパイプも使用) を実行する必要があるためmv *.1stextension *.2ndextension
、mv *.txt *.c
. 問題は、バッチや for ループを使用できないため、すべてパイプと sed コマンドで実行する必要があることです。
質問する
19667 次
7 に答える
11
文字列操作を使用できます
filename="file.ext1"
mv "${filename}" "${filename/%ext1/ext2}"
または、システムがサポートしている場合は、 を使用できますrename
。
アップデート
このようなこともできます
mv ${filename}{ext1,ext2}
これはブレース展開と呼ばれます
于 2013-10-03T17:07:08.733 に答える
5
sed は、ファイル名自体ではなく、ファイルの内容を操作するためのものです。私のおすすめ:
rename 's/\.ext/\.newext/' ./*.ext
または、役立つはずのこの既存の質問があります。
于 2013-10-03T17:54:38.130 に答える
4
これはうまくいくかもしれません:
find . -name "*.txt" |
sed -e 's|./||g' |
awk '{print "mv",$1, $1"c"}' |
sed -e "s|\.txtc|\.c|g" > table;
chmod u+x table;
./table
ループを使用できない理由がわかりません。それは人生をより簡単にします:
newex="c"; # Give your new extension
for file in *.*; # You can replace with *.txt instead of *.*
do
ex="${file##*.}"; # This retrieves the file extension
ne=$(echo "$file" | sed -e "s|$ex|$newex|g"); # Replaces current with the new one
echo "$ex";echo "$ne";
mv "$file" "$ne";
done
于 2013-10-03T17:16:40.763 に答える
3
を使用find
してすべてのファイルを検索し、それをパイプしてwhile read
ループに入れることができます。
$ find . -name "*.ext1" -print0 | while read -d $'\0' file
do
mv $file "${file%.*}.ext2"
done
小さい右側のパターン フィルター${file%.*}
です。は右側から削除するパターンを示します (可能な限り最小のグロブ パターンに一致します) 。%
.*
.
.
は-print0
ファイル名を のNUL
代わりに文字で区切ります\n
。は-d $'\0'
、文字で区切られたファイル名を読み込みますNUL
。このようにして、スペース、タブ、\n
、またはその他の風変わりな文字を含むファイル名が正しく処理されます。
于 2013-10-03T17:23:52.930 に答える
2
sed と sh のみを使用した別のソリューション
printf "%s\n" *.ext1 |
sed "s/'/'\\\\''/g"';s/\(.*\)'ext1'/mv '\''\1'ext1\'' '\''\1'ext2\''/g' |
sh
より良いパフォーマンスのために: 作成されるプロセスは 1 つだけです
perl -le '($e,$f)=@ARGV;map{$o=$_;s/$e$/$f/;rename$o,$_}<*.$e>' ext2 ext3
于 2013-10-03T19:40:44.537 に答える