295

ディレクトリには、プレフィックスで始まる複数のファイルがありますfgh。次に例を示します。

fghfilea
fghfileb
fghfilec

それらすべての名前をプレフィックス.で始まるように変更したいと思いますjkl。各ファイルの名前を個別に変更する代わりに、それを行うための単一のコマンドはありますか?

4

23 に答える 23

332

いくつかの方法がありますが、renameおそらく使用するのが最も簡単です。

の1つのバージョンを使用するrename

rename 's/^fgh/jkl/' fgh*

別のバージョンを使用する( Judy2Kの回答renameと同じ):

rename fgh jkl fgh*

プラットフォームのマニュアルページをチェックして、上記のどれが当てはまるかを確認する必要があります。

于 2009-07-06T11:24:41.700 に答える
130

これは、名前の変更を行うために一緒に使用する方法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
于 2009-07-06T11:38:17.787 に答える
90

rename はすべてのシステムにあるとは限りません。持っていない場合は、bash シェルでこの例のシェルを使用してください

for f in fgh*; do mv "$f" "${f/fgh/xxx}";done
于 2009-07-07T02:22:44.367 に答える
21

これを行うには多くの方法があります (これらすべてがすべての 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 システムで必要なものをここで見つけることができます。

于 2012-10-12T09:41:50.793 に答える
16
rename fgh jkl fgh*
于 2009-07-06T11:28:19.977 に答える
11

findxargsおよび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を呼び出すことです。

于 2014-06-02T22:03:14.770 に答える
3

コマンドラインGroovyを使用してそれを行う方法は次のとおりです。

groovy -e 'new File(".").eachFileMatch(~/fgh.*/) {it.renameTo(it.name.replaceFirst("fgh", "jkl"))}'
于 2013-08-06T16:47:37.900 に答える
2
#!/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
于 2014-06-23T09:02:35.120 に答える
2

Solarisでは、次を試すことができます:

for file in `find ./ -name "*TextForRename*"`; do 
    mv -f "$file" "${file/TextForRename/NewText}"
done
于 2014-12-23T11:41:05.647 に答える
1

大量ファイルの名前を変更する私のバージョン:

for i in *; do
    echo "mv $i $i"
done |
sed -e "s#from_pattern#to_pattern#g” > result1.sh
sh result1.sh
于 2014-08-25T07:01:33.023 に答える
1

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
于 2014-05-11T10:04:00.227 に答える
0

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*
于 2016-10-13T04:25:34.920 に答える
0

これは正規表現を使用して私のために働いた:

ファイルの名前を次のように変更したかった:

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 

警告、注意してください。

于 2016-05-06T19:56:55.020 に答える
0

すべての .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;
于 2016-05-29T16:29:14.723 に答える
0

以下のスクリプトも使用できます。端末で実行するのは非常に簡単です...

//一度に複数のファイルの名前を変更

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
于 2017-02-15T12:53:25.723 に答える