フォルダ内のすべてのファイルの名前をプレフィックス付きで変更します "Unix_"
フォルダに2つのファイルがあるとします
a.txt
b.pdf
次に、両方の名前を1つのコマンドからに変更する必要があります
Unix_a.txt
Unix_b.pdf
フォルダ内のすべてのファイルの名前をプレフィックス付きで変更します "Unix_"
フォルダに2つのファイルがあるとします
a.txt
b.pdf
次に、両方の名前を1つのコマンドからに変更する必要があります
Unix_a.txt
Unix_b.pdf
回答:
ファイル名にホワイトペースが含まれておらず、サブディレクトリがない場合は、単純なfor
ループを使用できます。
$ for FILENAME in *; do mv $FILENAME Unix_$FILENAME; done
それ以外の場合は、便利なrename
コマンド(perlスクリプト)を使用します。ただし、すべてのUnixですぐに使用できるとは限りません(たとえば、OS Xには付属していませんrename
)。
debian-administration.orgでの簡単な概要:
ファイル名に空白が含まれている場合は使いやすくfind
、Linuxでは次のように機能するはずです。
$ find . -type f -name '*' -printf "echo mv '%h/%f' '%h/Unix_%f\n'" | sh
BSDシステムでは-printf
、残念ながらオプションはありません。ただし、GNU findutilsはインストール可能である必要があります(Mac OS Xなどbrew install findutils
)。
$ gfind . -type f -name '*' -printf "mv \"%h/%f\" \"%h/Unix_%f\"\n" | sh
find
。
for f in *; do [[ -f ${f} ]] && mv ...; done
ファイルのみをキャッチすることをお勧めします(サブディレクトリ、リンクなどはありません)...
for FILENAME in *; do mv "$FILENAME" "Unix_$FILENAME"; done
、ファイル名に含まれる文字に関係なく正しく機能します。ディレクトリ、ソケット、シンボリックリンク、その他のファイルタイプも移動します。それは問題ではないと思います。
.
のすべての前の私のファイル
ファイルのあるフォルダでrename
コマンドを試してください:
rename 's/^/Unix_/' *
名前の変更(sed s command)の引数は、正規表現^をUnix_に置き換えることを示しています。キャレット(^)は、行の開始を意味する特殊文字です。
's/^/.../'
意味ですか?
's/^/.../'
は、名前変更コマンド
rename 's/^start_/run_' *
私はこれがまさにあなたが探しているものだと思います:
ls | xargs -I {} mv {} Unix_{}
はい、それはシンプルでありながらエレガントでパワフルであり、ワンライナーでもあります。次のページで私からより詳細な紹介を得ることができます:ファイルとディレクトリの名前の変更(プレフィックスの追加)
ls
。ファイル名にスペースやその他の奇妙な文字が含まれていると、問題が発生する可能性があります。
私は最近、これと同じ状況に直面し、より簡単な組み込みソリューションを見つけました。解決策を探している他の人に役立つように、ここで共有しています。
OS X Yosemiteにより、Appleはバッチ名前変更機能をFinderに直接統合しました。詳細情報はこちらからご覧いただけます。以下の手順もコピーしました。
複数のアイテムの名前を変更する
アイテムを選択し、Controlキーを押しながらアイテムの1つをクリックします。
ショートカットメニューで、[アイテムの名前を変更]を選択します。
[フォルダアイテムの名前を変更]の下のポップアップメニューで、名前のテキストを置き換えるか、名前にテキストを追加するか、名前の形式を変更するかを選択します。
テキストの置換:削除するテキストを[検索]フィールドに入力し、追加するテキストを[置換]フィールドに入力します。
テキストの追加:フィールドに追加するテキストを入力し、現在の名前の前または後にテキストを追加することを選択します。
形式:ファイルの名前の形式を選択してから、名前の前後にインデックス、カウンター、または日付を配置することを選択します。[カスタムフォーマット]フィールドに名前を入力してから、開始する番号を入力します。
[名前の変更]をクリックします。
ファイルに共通のパターンがある場合は、[テキストの置換]を使用できます。それ以外の場合は、[テキストの追加]でも機能します。
-i
代わりに使用できます-I {}
ls | xargs -i mv {} unix_{}
これも完璧に機能します。
ls
-ディレクトリ内のすべてのファイルを一覧表示しますxargs
--i
オプションにより、すべてのファイルを1行ずつ受け入れます{}
xargs
入力として3つ以上の引数を取得する場合に必要な、すべてのファイルのプレースホルダーです。awkの使用:
ls -lrt | grep '^-' | awk '{print "mv "$9" unix_"$9""}' | sh
-i
は非推奨になりましたが、現在はちょうど-I
スペースのあるアイテムでも機能し、ディレクトリを無視します
for f in *; do [[ -f "$f" ]] && mv "$f" "unix_$f"; done
rename
、私にrnm
はうまくいきませんが、うまくいきます。
状況:
我々は持っているcertificate.key
certificate.crt
内部/user/ssl/
私たちは、で始まる何も名前を変更するcertificate
にはcertificate_OLD
私たちは今、中に位置しています /user
まず、ドライランを行います-n
:
rename -n "s/certificate/certificate_old/" ./ssl/*
どちらが返されますか:
rename(./ssl/certificate.crt, ./ssl/certificate_OLD.crt)
rename(./ssl/certificate.key, ./ssl/certificate_OLD.key)
ファイルは変更されません。これは単なるテスト実行です。
解決:
テストの結果に満足したら、実際に実行します。
rename "s/certificate/certificate_OLD/" ./ssl/*
その意味:
`名前の変更" s / SOMETHING / SOMETING_ELSE "PATH / FILES
ヒント:
すでにパス上にいる場合は、次のように実行します。
rename "s/certificate/certificate_OLD/" *
または、ss
doで始まるサブディレクトリでこれを実行する場合:
rename -n "s/certificat/certificate_old/" ./ss*/*
次のこともできます。
rename -n "s/certi*/certificate_old/" ./ss*/*
これは、certi
で始まるサブディレクトリ内のすべての名前を変更しss
ます。
空が限界です。
正規表現で遊んで、常にこの前にをテストしてください-n
。
これに注意すると、一致するフォルダ名の名前が変更されます。よりよいcd
ディレクトリに、そこにそれを行います。自己責任で使用してください。
find -execdir rename
これにより、ファイルとディレクトリの名前が、ベース名のみに影響する正規表現に変更されます。
したがって、プレフィックスについては、次のことができます。
PATH=/usr/bin find . -depth -execdir rename 's/^/Unix_/' '{}' \;
またはファイルのみに影響します:
PATH=/usr/bin find . -type f -execdir rename 's/^/Unix_/' '{}' \;
-execdir
cd
ベース名でのみ実行する前に、最初にディレクトリに移動します。
Linuxで複数のファイルを検索して名前を変更する方法について詳しく説明しました。