web-dev-qa-db-ja.com

単一のUNIXコマンドで、プレフィックスを使用してフォルダー内のすべてのファイルの名前を変更する

フォルダー内のすべてのファイルの名前を接頭辞「Unix_」で変更します。つまり、フォルダーに2つのファイルa.txtとb.pdfがあり、両方のファイル名を単一のコマンドからUnix_a.txtとUnix_b.pdfに変更する必要があるとします

71
vasanthi

ファイル名に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
90
miku

ファイルがあるフォルダーでrenameコマンドを試してください

rename 's/^/Unix_/' *

Rename( sed s command )の引数は、正規表現^に置き換えることを示しますUnix _。キャレット(^)は、行の開始を意味する特殊文字です

69
pavium

私はこれがあなたが探しているものだと思う:

ls | xargs -I {} mv {} Unix_{}

はい、シンプルでエレガント、そしてパワフルであり、他に類を見ないものです。あなたはページで私からより詳細なイントロを得ることができます: ファイルとディレクトリの名前を変更する(プレフィックスを追加)

25
Zheng Qsin

私は最近この同じ状況に直面し、より簡単な組み込みソリューションを見つけました。ここで共有しているので、他の人が解決策を探しているときに役立つかもしれません。

OS X Yosemiteでは、Appleがバッチ名変更機能をFinderに直接統合しました。詳細情報が利用可能です こちら 。以下の手順もコピーしましたが、

複数のアイテムの名前を変更する

  1. 項目を選択し、Controlキーを押しながらそれらのいずれかをクリックします。

  2. ショートカットメニューで、[アイテム名の変更]を選択します。

  3. [フォルダアイテムの名前変更]の下のポップアップメニューで、名前のテキストの置換、名前へのテキストの追加、または名前の形式の変更を選択します。

    • テキストを置換:[検索]フィールドに削除するテキストを入力し、[置換]フィールドに追加するテキストを入力します。

    • テキストの追加:フィールドに追加するテキストを入力し、現在の名前の前後にテキストを追加することを選択します。

    • 形式:ファイルの名前形式を選択し、名前の前後にインデックス、カウンター、または日付を配置することを選択します。 [カスタム形式]フィールドに名前を入力し、開始する番号を入力します。

  4. [名前の変更]をクリックします。

ファイルに共通のパターンがある場合は、テキストの置換を使用できます。それ以外の場合は、テキストの追加も機能します。

12
Tejas C

-iの代わりに-I {}を使用できます

ls | xargs -i mv {} unix_{}

これも完全に機能します。

  • ls-ディレクトリ内のすべてのファイルをリストします
  • xargs--iオプションにより、すべてのファイルを1行ずつ受け入れます
  • {}はすべてのファイルのプレースホルダーです。xargsが入力として3つ以上の引数を取得する場合に必要です

Awkの使用:

ls -lrt | grep '^-' | awk '{print "mv "$9" unix_"$9""}' | sh
5
NirajW

スペースを含むアイテムでも機能し、ディレクトリを無視します

for f in *; do [[ -f "$f" ]] && mv "$f" "unix_$f"; done
1
user645527

rnm (インストールする必要があります):

rnm -ns 'Unix_/fn/' *

または

rnm -rs '/^/Unix_/' *

追伸:私はこのツールの著者です。

1
Jahid

状況:

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独自のリスクを使用します。

0