フォルダー内のすべてのファイルの名前を接頭辞「Unix_」で変更します。つまり、フォルダーに2つのファイルa.txtとb.pdfがあり、両方のファイル名を単一のコマンドからUnix_a.txtとUnix_b.pdfに変更する必要があるとします
ファイル名にno whitepaceが含まれていて、サブディレクトリがない場合、単純な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 はインストール可能である必要があります(たとえば、brew install findutils
を使用するMac OS X)。
$ gfind . -type f -name '*' -printf "mv \"%h/%f\" \"%h/Unix_%f\"\n" | sh
ファイルがあるフォルダーでrename
コマンドを試してください:
rename 's/^/Unix_/' *
Rename( sed s command )の引数は、正規表現^をに置き換えることを示しますUnix _。キャレット(^)は、行の開始を意味する特殊文字です。
私はこれがあなたが探しているものだと思う:
ls | xargs -I {} mv {} Unix_{}
はい、シンプルでエレガント、そしてパワフルであり、他に類を見ないものです。あなたはページで私からより詳細なイントロを得ることができます: ファイルとディレクトリの名前を変更する(プレフィックスを追加)
私は最近この同じ状況に直面し、より簡単な組み込みソリューションを見つけました。ここで共有しているので、他の人が解決策を探しているときに役立つかもしれません。
OS X Yosemiteでは、Appleがバッチ名変更機能をFinderに直接統合しました。詳細情報が利用可能です こちら 。以下の手順もコピーしましたが、
複数のアイテムの名前を変更する
項目を選択し、Controlキーを押しながらそれらのいずれかをクリックします。
ショートカットメニューで、[アイテム名の変更]を選択します。
[フォルダアイテムの名前変更]の下のポップアップメニューで、名前のテキストの置換、名前へのテキストの追加、または名前の形式の変更を選択します。
テキストを置換:[検索]フィールドに削除するテキストを入力し、[置換]フィールドに追加するテキストを入力します。
テキストの追加:フィールドに追加するテキストを入力し、現在の名前の前後にテキストを追加することを選択します。
形式:ファイルの名前形式を選択し、名前の前後にインデックス、カウンター、または日付を配置することを選択します。 [カスタム形式]フィールドに名前を入力し、開始する番号を入力します。
[名前の変更]をクリックします。
ファイルに共通のパターンがある場合は、テキストの置換を使用できます。それ以外の場合は、テキストの追加も機能します。
-i
の代わりに-I {}
を使用できます
ls | xargs -i mv {} unix_{}
これも完全に機能します。
ls
-ディレクトリ内のすべてのファイルをリストしますxargs
--i
オプションにより、すべてのファイルを1行ずつ受け入れます{}
はすべてのファイルのプレースホルダーです。xargs
が入力として3つ以上の引数を取得する場合に必要ですAwkの使用:
ls -lrt | grep '^-' | awk '{print "mv "$9" unix_"$9""}' | sh
スペースを含むアイテムでも機能し、ディレクトリを無視します
for f in *; do [[ -f "$f" ]] && mv "$f" "unix_$f"; done
状況:
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/*
その意味:
`rename" s/SOMETHING/SOMETING_ELSE "PATH/FILES
ヒント:
既にパス上にある場合は、次のように実行します。
rename "s/certificate/certificate_OLD/" *
または、ss
で始まるサブディレクトリでこれを実行する場合は、次のようにします。
rename -n "s/certificat/certificate_old/" ./ss*/*
次のこともできます。
rename -n "s/certi*/certificate_old/" ./ss*/*
これは、certi
で始まるサブディレクトリ内のss
で始まるすべての名前を変更します。
空は限界です。
正規表現で遊んで、常に-n
でこの前にテストしてください。
これを見ると、一致するフォルダ名も変更されます。ディレクトリにcd
を追加して、そこで実行します。 AT独自のリスクを使用します。