4

ファイル拡張子を変更するには、sed 行 (Linux ではパイプも使用) を実行する必要があるためmv *.1stextension *.2ndextensionmv *.txt *.c. 問題は、バッチや for ループを使用できないため、すべてパイプと sed コマンドで実行する必要があることです。

4

7 に答える 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 に答える