スペースを含むファイル/ディレクトリの名前をまとめて変更するには?

スペースを含むファイル/ディレクトリの名前をまとめて変更するには?

ファイル/ディレクトリ名の断片を置き換えて、多くのファイルおよびf o o/またはディレクトリの名前をまとめて変更するには?b a r

提案された各方法について、次の質問に答えるのが最善です。

  • 実際の名前を変更する前にコマンドの結果をプレビューできますか?どのように?
  • この方法は接頭辞にのみ適用されますか、接尾辞にのみ適用されますか、または両方に適用されますか?
  • 名前の変更はディレクトリにのみ影響しますか、ファイルにのみ影響しますか、それともディレクトリとファイルの両方に影響しますか?
  • サブディレクトリのファイル/ディレクトリの名前も変更されますか?

代替プレフィックス、例

作業をより具体的にするために、次のファイルを想定します
o l d prefix file 1.c
o l d prefix file 1.h
o l d prefix file 2.c
o l d prefix file 2.h

n e w prefix file 1.c
n e w prefix file 1.h
n e w prefix file 2.c
n e w prefix file 2.h

また、同じディレクトリに次のファイルがあるとします。
o l d prefix, dir 1 _
o l d prefix, dir 2 _

このディレクトリの名前も変更されますか?

ファイルではなくディレクトリ名のみを変更するようにアプローチを調整できますか?
それともファイル名を変更しますか(ディレクトリではありません)?

サフィックスの置換

名前の変更も検討してください。サフィックスファイル内のsoとは、
file 1, o l d suffixそれぞれfile 2, o l d suffixに名前が変更されます。
file 1, n e w suffixfile 2, n e w suffix

ディレクトリにも同じです。そしてそれぞれの名前を
dir 1., o l d suffix変更してください。dir 2., o l d suffix
dir 1., n e w suffixdir 2., n e w suffix

おすすめの方法は?

どの名前の変更方法をお勧めしますか?

ノート

気づく次へ追加名前の接頭辞または接尾辞は、より一般的な特殊なケースにすぎません。変える接頭辞または接尾辞の場合、つまり元の接頭辞または接尾辞が偶然空の文字列である場合。同様に状況削除する接頭辞または接尾辞は、接頭辞または接尾辞を置き換える特別な場合でもあります。つまり、新しいプレフィックスまたはサフィックスは空の文字列です。

考慮すべき追加の問題

下記の最後の5つの問題のように、日付、シリアル番号、および/またはタイトルを追加または削除するなど、ファイル名を変更するときに考慮する必要がある他の高度な問題があることがわかります。

ファイル/ディレクトリ(またはシンボリックリンク)の名前変更について質問し、回答に適した例を作成してください。

回答を書くときに答えをしなければならないという感じを受けないでください。みんなここで紹介されたケース!
ただフォローしても構いません。一つ必要に応じて特定の状況(上記のいずれか、または選択した他の状況)。

引用する

答え1

0.普遍的な解決を模索する 1

将来の私と他の読者の便宜のために、私は次に集中します。一般的な解決策。

単純化のために、以下があるとします。いいえ引用符 – 二重引用符 ( ") と一重引用符 ( ') なし – inどのファイル/ディレクトリ名。 2

最初の例として、パターンを使用してファイル名を
o l d prefix file *.*に変更する方法を示します
n e w prefix file *.*
これにより、ファイル名にスペースがあってもプレフィックスの名前が変わります。

私はまた、ディレクトリの名前を変更することに興味があるので、ディレクトリの名前を
o l d prefix, dir 1 _それぞれo l d prefix, dir 2 _とに変更することを検討してみましょう。
n e w prefix, dir 1 _n e w prefix, dir 2 _

第二に、サフィックスを変更する方法を紹介します。たとえば、ファイル
file 1, o l d suffixとはそれぞれにfile 2, o l d suffix名前が変更されます。
file 1, n e w suffixfile 2, n e w suffix

もう一度これがディレクトリにどのような影響を与えるか(または影響を与えないか)確認したいと思います。
したがって、ディレクトリと名前が
dir 1., o l d suffixそれぞれにdir 2., o l d suffix変わったことを確認します。 サム
dir 1., n e w suffixdir 2., n e w suffix

上記のすべてのファイルとディレクトリはzipファイルに含まれています。
http://user.it.uu.se/~hesc0353/Files-&-dirs-SEunix-A690768.zip4

メモ。
以下の解決策に存在するということは、echo名前の変更が発生しないことを意味します。
これは確立された技術です。時事名前を変更することを決める前に。
プレビューが良くなったら、echoコマンドを削除してやり直して、実際の名前変更を行います。 5

1. forループを使用した一般的なソリューション

名前変更プレフィックス6o l d prefixに置き換えられることを示しますn e w prefix

for f in "o l d prefix"*; do\
 echo mv "$f" "n e w prefix""${f#o l d prefix}"; done

私は検索を選択しましたo l d pref

名前変更サフィックス、努力する:

for f in *"l d suffix"; do\
 echo mv "$f" "${f%o l d suffix}""n e w suffix"; done

名前の変更はディレクトリにのみ影響しますか、ファイルにのみ影響しますか、それともディレクトリとファイルの両方に影響しますか?

– この方法で名前が変更されました両方ファイルとディレクトリ。
これが望ましくない場合は、find ... -type ... -exec 次のセクションの方法を試してください。

サブディレクトリのファイル/ディレクトリの名前も変更されますか?

- そうではありません。上記のいずれかのコマンドをテンプレートとして使用しても、サブディレクトリのファイル/ディレクトリは影響を受けません。これを行うには、意識的に方法をかなり調整する必要があります。
たとえば、最初のソリューションをご覧ください。この回答

2. 汎用ソリューションの使用find ... -exec mv

以下の方法はfind ... -exec mvファイル名を変更するオプションを提供しますただまたはディレクトリただ-typeフラグを通して。フラグを使用すると、コマンドがファイルまたはディレクトリを検索する必要があるサブディレクトリツリーの深さを制御するように調整することもできます -maxdepth

プレフィックス名の変更

次のコマンドは o l d prefixで置き換えられますが、n e w prefixディレクトリのみ。各ファイルは別々のサブシェルから名前を変更できますが、内部的にforループを使用すると-exec(finalではなく-exec同時)コマンドがより効率的に実行されます。sh {} +{} \;

find . -maxdepth 1 -type d -name "o l d pr*" -exec sh -c\
 'for n; do echo mv "${n#./}" "n e w pre${n#./o l d pre}"; done' sh {} +

名前を変更したい場合ファイルのみ-type f代わりに使用してください-type d(覚えやすさ:fファイル用、dディレクトリ用)。

サフィックス名の変更

今回も交換方法をお知らせします。サフィックス多くの水路文書:

find . -maxdepth 1 -type f -name "*d suffix" -exec sh -c\
 'for n; do echo mv "$n" "${n%o l d suffix}n e w suffix"; done' sh {} +

説明する

  • find .現在のディレクトリとそのサブディレクトリ内で検索します。
  • -maxdepth 1するいいえサブディレクトリで検索してください。
  • -type fファイルのみを探します(ディレクトリを除く)。
  • -name "*d suffix"で終わるファイルのみを検索しますd suffix
  • -exec sh -c '...'サブシェルで実行され、コマンドの置き換えが可能です$(...)
  • -exec sh -c 'for n; do mv ...' sh {} +
    -exec sh -c 'mv ...' {} \;他の方法で同じことを行うよりも効率的です。7
  • {}あなたが見つけたものは何でも捕まえてくださいfind
  • echoコマンド結果出力 - 結果に満足したら、コマンドを
    削除して再実行します。echo
  • mv "sou rce" "dest in"実際の名前を変更して、古い
    名前を新しい名前に変更します。sou rcedest in
  • %バラよりPOSIX シェルモードのフィルタリング
  • doneforループを終了します。
  • sh {} +前述のように、節sh {} +を消してください-exec sh -c

名前を変更する両方ファイルとディレクトリ

意図的な名前の変更両方ファイルとディレクトリは一度に完了します-type。以下を省略してください。

find . -maxdepth 1 -name "o l d pr*" -exec sh -c\
 'for n; do echo mv "${n#./}" "n e w pre${n#./o l d pre}"; done' sh {} +

サブディレクトリのファイル/ディレクトリの名前も変更されますか?

この-maxdepth 1セクションでは、サブディレクトリツリーのファイル/ディレクトリが影響を受けないようにします。
意図的にサフィックスの名前を変更したい場合みんなファイルは次の場所にあります。みんな サブディレクトリの例は次のとおりです。

find . -type f -name "*d suffix" -exec sh -c\
 'for n; do echo mv "$n" "${n%o l d suffix}n e w suffix"; done' sh {} +

警告の言葉。
この方法はいいえ1 つのコマンドで、さまざまなサブディレクトリのプレフィックス名を変更するために使用されます。

3. Perlの名前変更を使用したソリューション

このセクションは、特に次の人のためのものです。 ラリー・ウォールがPerlの名前を変える システムにインストールされているか(またはインストール方法がわかっているか) 8

renameprename私はPerlスクリプトと混乱を避けるためにPerlスクリプトの名前を変更する慎重な慣行が好きです。Linuxの名前を変更する

この方法は接頭辞にのみ適用されますか、接尾辞にのみ適用されますか、または両方に適用されますか?

プレフィックスまたはサフィックスの名前を変更するかどうか気にする必要がないという事実は、Perlの名前変更を使いやすくします。

たとえば、次のように置き換えるには、次のようにo l d prefixしますn e w prefix

prename -n 's/o l d prefix/n e w prefix/' ./"o l d p"*

どの-nフラグ時事
目的の結果が出たら、フラグを削除して-nコマンドを再実行してください。

名前の変更はディレクトリにのみ影響しますか、ファイルにのみ影響しますか、それともディレクトリとファイルの両方に影響しますか?

セクション1のforループ方式と同様に、実行するとprename名前が変更されます。両方ディレクトリとファイル。

if -fただし、名前の変更文字列の末尾に以下を追加して、ファイル(ディレクトリではない)のみを名前変更することを 選択できます。

prename -n 's/o l d prefix/n e w prefix/ if -f' ./"o l d p"*

ファイル以外のディレクトリの名前を変更するには、次のようにしますif !-f

prename -n 's/o l d prefix/n e w prefix/ if !-f' ./"o l d p"*

サブディレクトリのファイル/ディレクトリの名前も変更されますか?

スラッシュ(/)を区切り文字として使用すると、Perlの名前変更は、サブディレクトリではなく現在の作業ディレクトリのファイル/ディレクトリ名のみを変更することがわかりました。
別の文字を区切り文字として使用している場合は、実際にそれを使用してprenameサブディレクトリツリーのファイル/ディレクトリの名前を変更できます。
2番目の解決策はこの回答やや非正統的なアプローチの例です。

より一般的なアプローチはfind ... -execdirと組み合わせることですprename
これの例については、次を参照してください。 この回答

4. ファイルまたはディレクトリの名前を変更するのに便利なその他のオプション

上記の方法が気に入らない場合、 sedまたはawk(おそらく一緒にxargs)使用を検討してください。

引用する


1この回答で提供されているコマンド/ソリューションをテストするときは、本物のLinuxまたは本物のUnixではなく、Windows 10のMSYS2を使用しました。これはおそらくMicrosoft Windows(Linux)で実行されているシミュレートされたアーチです。もちろん、私のようなWindowsユーザーに実行可能な選択肢は、次のものを使用することです。 Linux用Windowsサブシステム(WSL)
MSYS2は便利で使いやすいので使用します。

2疑わしい場合は、コマンドの結果を確認して
名前の変更を検討してください。または、より良い方法は次のとおりです。ファイル/ディレクトリ名に引用符を使用すると、明らかに問題を引き起こすと思います。ls *\"*ls *\'*
find . -name '*"*'find . -name "*'*"

この回答ファイル/ディレクトリ名に禁止文字を一覧表示します。
– Linux/Unix の場合、禁止文字はスラッシュ ( /) 1 つだけです。

3私はしますいいえ質問で求められているように、プレフィックスとサフィックスを一度に変更できる解決策を見つけることが目標です。 Bashを使用したファイル名の変更、プレフィックス、およびサフィックスの削除。 (プレフィックスとサフィックスの名前を変更する必要がある場合は、1つのコマンドで1つを変更し、別のコマンドで別の名前を変更することをお勧めします。)

4読者はzipファイルをダウンロードしていくつかの(空の)ディレクトリに解凍し、この回答で提供されたすべてのコマンドを試すことをお勧めします。

5空白を含むファイルとディレクトリの場合、前後に二重引用符()がないため、プレビューが正しく表示されないことがあります"。これを削除しても、echoコマンドは正しく実行されます。
(プレビューを文字通り受け入れないでください!)

6長いコマンドを折り返すためにバックスラッシュ(\)を使用するので、読者は水平方向にスクロールする必要はありません。具体的な例を直接作成する場合は、バックスラッシュを削除してコマンド全体を1行に書き込むことをお勧めします。

7{} +違いについて詳しくは、{} \;例をご覧ください。 呼び出されたシェルコマンドを終了する方法-exec(および対応する参照)。

8端末にrenameまたはを入力します。 Perl renameをインストールしたら、その単語を含む類似アイテムを見ることができます。インストールされていない場合、同様の内容が表示されると予想されます。試してみるもう1つの方法は次のとおりです。prenameEnterUsage: rename [-v] [-n] [-f] perlexpr [filenames]perlexpr
bash: prename: command not found
which prename

9 このコメントこの if -fセクションでは、シンボリックリンクの名前も変更すると仮定します。シンボリックリンクの名前を変更しない場合は、
代わりにシンボリックリンクを使用することをお勧めします。if (-f && ! -l)

関連情報