1つのコマンドで、プレフィックス付きのフォルダ内のすべてのファイルの名前を変更します


85

フォルダ内のすべてのファイルの名前をプレフィックス付きで変更します "Unix_"

フォルダに2つのファイルがあるとします

a.txt
b.pdf

次に、両方の名前を1つのコマンドからに変更する必要があります

Unix_a.txt
Unix_b.pdf

1
このリンク=>チェックcyberciti.biz/tips/...
赤い目devの

ここをチェックしてください:theunixshell.blogspot.com/2013/01/…–
Vijay

回答:


106

ファイル名にホワイトペースが含まれておらず、サブディレクトリがない場合は、単純な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

@Matteo:ヒントに感謝します:警告と2つの例で私の答えを更新しましたfind
miku 2013

また、for f in *; do [[ -f ${f} ]] && mv ...; doneファイルのみをキャッチすることをお勧めします(サブディレクトリ、リンクなどはありません)...
twalberg 2013

1
必要に応じて変数を引用するとfor FILENAME in *; do mv "$FILENAME" "Unix_$FILENAME"; done、ファイル名に含まれる文字に関係なく正しく機能します。ディレクトリ、ソケット、シンボリックリンク、その他のファイルタイプも移動します。それは問題ではないと思います。
ジョナサンレフラー2018年

どういうわけか、これは追加.のすべての前の私のファイル
NULL値を許可するかどうかを

75

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

rename 's/^/Unix_/' *

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


8
どういう's/^/.../'意味ですか?
mcont 2016


これはすごい!フォルダ/ *を追加することをお勧めします。コマンドが誤って別の場所で繰り返される場合、*は少し危険だからです
SystemsRebooter19年

brew install rename @OliverPearmain
フェリペ

例には、接頭辞を交換しますrename 's/^start_/run_' *
デニス・コロディン

33

私はこれがまさにあなたが探しているものだと思います:

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

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


2
の出力の処理には注意してくださいls。ファイル名にスペースやその他の奇妙な文字が含まれていると、問題が発生する可能性があります。
ジョナサンレフラー2018年

15

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

OS X Yosemiteにより、Appleはバッチ名前変更機能をFinderに直接統合しました。詳細情報はこちらからご覧いただけます。以下の手順もコピーしました。

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

  1. アイテムを選択し、Controlキーを押しながらアイテムの1つをクリックします。

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

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

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

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

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

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

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


すばらしい-私は多くの時間を節約できました!
user3000868 2016

6

-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
JamPow 2017年

Debian 8.Thaks
Abror Esonaliyev 2017年

2

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

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

1

RNM(あなたがそれをインストールする必要があります):

rnm -ns 'Unix_/fn/' *

または

rnm -rs '/^/Unix_/' *

PS:私はこのツールの作者です。


2
ユーティリティに関するすべての回答を確認し、自分がその作成者であるという免責事項を追加する必要があります。
モグスダッド2016年

@Mogsdad:必要な情報ではないと思います。誰かが著者を見つけたいのなら、それはとても簡単です。
Jahid 2016年

このツールをありがとう。どういうわけかrename、私にrnmはうまくいきませんが、うまくいきます。
アロソ

0

状況:

我々は持っている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/" *

または、ssdoで始まるサブディレクトリでこれを実行する場合:

rename -n "s/certificat/certificate_old/" ./ss*/*

次のこともできます。

rename -n "s/certi*/certificate_old/" ./ss*/*

これは、certiで始まるサブディレクトリ内のすべての名前を変更しssます。

空が限界です。

正規表現で遊んで、常にこの前にをテストしてください-n

これに注意すると、一致するフォルダ名の名前が変更されます。よりよいcdディレクトリに、そこにそれを行います。自己責任で使用してください。


0

find -execdir rename

これにより、ファイルとディレクトリの名前が、ベース名のみに影響する正規表現に変更されます。

したがって、プレフィックスについては、次のことができます。

PATH=/usr/bin find . -depth -execdir rename 's/^/Unix_/' '{}' \;

またはファイルのみに影響します:

PATH=/usr/bin find . -type f -execdir rename 's/^/Unix_/' '{}' \;

-execdircdベース名でのみ実行する前に、最初にディレクトリに移動します。

Linuxで複数のファイルを検索して名前を変更する方法について詳しく説明しました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.