ディレクトリには、プレフィックスで始まる複数のファイルがありますfgh
。次に例を示します。
fghfilea
fghfileb
fghfilec
それらすべての名前をプレフィックス.で始まるように変更したいと思いますjkl
。各ファイルの名前を個別に変更する代わりに、それを行うための単一のコマンドはありますか?
ディレクトリには、プレフィックスで始まる複数のファイルがありますfgh
。次に例を示します。
fghfilea
fghfileb
fghfilec
それらすべての名前をプレフィックス.で始まるように変更したいと思いますjkl
。各ファイルの名前を個別に変更する代わりに、それを行うための単一のコマンドはありますか?
これは、名前の変更を行うために一緒に使用する方法sed
ですmv
。
for f in fgh*; do mv "$f" $(echo "$f" | sed 's/^fgh/jkl/g'); done
以下のコメントに従って、ファイル名にスペースが含まれている場合、ファイルの移動先の名前を返すサブ関数を引用符で囲む必要がある場合があります。
for f in fgh*; do mv "$f" "$(echo $f | sed 's/^fgh/jkl/g')"; done
rename はすべてのシステムにあるとは限りません。持っていない場合は、bash シェルでこの例のシェルを使用してください
for f in fgh*; do mv "$f" "${f/fgh/xxx}";done
これを行うには多くの方法があります (これらすべてがすべての unixy システムで機能するわけではありません)。
ls | cut -c4- | xargs -I§ mv fgh§ jkl§
§ は、都合のよいものに置き換えることができます。これを行うこともできますfind -exec
が、多くのシステムでは動作が微妙に異なるため、通常は避けます
for f in fgh*; do mv "$f" "${f/fgh/jkl}";done
彼らが言うように粗野だが効果的
rename 's/^fgh/jkl/' fgh*
本当にきれいですが、最も一般的なUNIXシステムであるBSDには名前の変更はありません。
rename fgh jkl fgh*
ls | perl -ne 'chomp; next unless -e; $o = $_; s/fgh/jkl/; next if -e; rename $o, $_';
Perl を使用したいが、システムに名前の変更がない場合は、このモンスターを使用できます。
それらのいくつかは少し複雑で、リストは完全ではありませんが、ほぼすべての UNIX システムで必要なものをここで見つけることができます。
rename fgh jkl fgh*
find
、xargs
およびsed
: _
find . -name "fgh*" -type f -print0 | xargs -0 -I {} sh -c 'mv "{}" "$(dirname "{}")/`echo $(basename "{}") | sed 's/^fgh/jkl/g'`"'
@nik のソリューションよりも複雑ですが、ファイルの名前を再帰的に変更できます。たとえば、構造、
.
├── fghdir
│ ├── fdhfilea
│ └── fghfilea
├── fghfile\ e
├── fghfilea
├── fghfileb
├── fghfilec
└── other
├── fghfile\ e
├── fghfilea
├── fghfileb
└── fghfilec
これに変換されます。
.
├── fghdir
│ ├── fdhfilea
│ └── jklfilea
├── jklfile\ e
├── jklfilea
├── jklfileb
├── jklfilec
└── other
├── jklfile\ e
├── jklfilea
├── jklfileb
└── jklfilec
それを機能させるための鍵は、 xargs からシェルxargs
を呼び出すことです。
コマンドラインGroovyを使用してそれを行う方法は次のとおりです。
groovy -e 'new File(".").eachFileMatch(~/fgh.*/) {it.renameTo(it.name.replaceFirst("fgh", "jkl"))}'
#!/bin/sh
#replace all files ended witn .f77 to .f90 in a directory
for filename in *.f77
do
#echo $filename
#b= echo $filename | cut -d. -f1
#echo $b
mv "${filename}" "${filename%.f77}.f90"
done
Solarisでは、次を試すことができます:
for file in `find ./ -name "*TextForRename*"`; do
mv -f "$file" "${file/TextForRename/NewText}"
done
大量ファイルの名前を変更する私のバージョン:
for i in *; do
echo "mv $i $i"
done |
sed -e "s#from_pattern#to_pattern#g” > result1.sh
sh result1.sh
Ruby でこれを行う方が (私の Mac では) はるかに簡単でした。以下に 2 つの例を示します。
# for your fgh example. renames all files from "fgh..." to "jkl..."
files = Dir['fgh*']
files.each do |f|
f2 = f.gsub('fgh', 'jkl')
system("mv #{f} #{f2}")
end
# renames all files in directory from "021roman.rb" to "021_roman.rb"
files = Dir['*rb'].select {|f| f =~ /^[0-9]{3}[a-zA-Z]+/}
files.each do |f|
f1 = f.clone
f2 = f.insert(3, '_')
system("mv #{f1} #{f2}")
end
sed
ファイルのリストで式を実行する汎用スクリプト(sed
ソリューションとrename
ソリューションを組み合わせます):
#!/bin/sh
e=$1
shift
for f in $*; do
fNew=$(echo "$f" | sed "$e")
mv "$f" "$fNew";
done
sed
のバージョンのように、スクリプトに式を渡してから、ファイルのリストを渡して呼び出しrename
ます。
script.sh 's/^fgh/jkl/' fgh*
これは正規表現を使用して私のために働いた:
ファイルの名前を次のように変更したかった:
file0001.txt -> 1.txt
ofile0002.txt -> 2.txt
f_i_l_e0003.txt -> 3.txt
[az|_]+0*([0-9]+. ) 正規表現を使用します ([0-9]+. ) は名前変更コマンドで使用するグループ部分文字列です
ls -1 | awk 'match($0, /[a-z|\_]+0*([0-9]+.*)/, arr) { print arr[0] " " arr[1] }'|xargs -l mv
プロデュース:
mv file0001.txt 1.txt
mv ofile0002.txt 2.txt
mv f_i_l_e0003.txt 3.txt
もう一つの例:
file001abc.txt -> abc1.txt
ofile0002abcd.txt -> abcd2.txt
ls -1 | awk 'match($0, /[a-z|\_]+0*([0-9]+.*)([a-z]+)/, arr) { print arr[0] " " arr[2] arr[1] }'|xargs -l mv
プロデュース:
mv file001abc.txt abc1.txt
mv ofile0002abcd.txt abcd2.txt
警告、注意してください。
すべての .mkv ファイルを再帰的に検索し、見つかったファイルの名前を .avi に変更するスクリプトを作成しました。ニーズに合わせてカスタマイズできます。将来何かを参照する必要がある場合に備えて、ファイル パスからファイル ディレクトリ、拡張子、ファイル名を取得するなど、他にもいくつか追加しました。
find . -type f -name "*.mkv" | while read fp; do
fd=$(dirname "${fp}");
fn=$(basename "${fp}");
ext="${fn##*.}";
f="${fn%.*}";
new_fp="${fd}/${f}.avi"
mv -v "$fp" "$new_fp"
done;
以下のスクリプトも使用できます。端末で実行するのは非常に簡単です...
//一度に複数のファイルの名前を変更
for file in FILE_NAME*
do
mv -i "${file}" "${file/FILE_NAME/RENAMED_FILE_NAME}"
done
例:-
for file in hello*
do
mv -i "${file}" "${file/hello/JAISHREE}"
done