Linux-ファイル名のスペースの置き換え


回答:


172

これはそれを行うはずです:

for file in *; do mv "$file" `echo $file | tr ' ' '_'` ; done

これは私にはうまくいきませんでした。同一のファイルが存在すると主張しました(ファイル名が間違っています)。たとえば、名前を変更しようとする1 - foo.jpgと、私のフォルダにはすでにその名前が含ま1.jpgれています。
byxor 2017年

3
バッククォートが引用符に近いと、読みにくい。同じですが、より読みやすくなりますfor file in *; do mv "$file" $(echo $file | tr ' ' '_') ; done
カミルSジャロン2018

注:これは、ファイル名を更新するディレクトリ内で実行されます。また、あなたは変更することができます*PATH_TO_YOUR_DIRECTORY
CFitz

71

Perlスタイルの正規表現を使用するコマンド「rename」を使用することを好みます。

rename "s/ /_/g" *

-nフラグを使用してドライランを実行できます。

rename -n "s/ /_/g" *

3
これは、perlスタイルの名前変更があり、単純なredhat / fedoraの名前変更がない場合に機能します
David Dean

9
fedoraのバージョンは次のようになりますrename " " "_" *
David Dean、

4
renameOSXでは使用できません。
エティエンヌローデカリー2014

macOS 10.12.3でrename利用可能です。
Sung Cho

1
@DavidDean Arch Linuxでの名前変更は、最初の出現のみを置き換えます(複数のスペースを持つファイル/ディレクトリの場合はあまり便利ではありません)。構文はfedoraと同じなので、同じものである可能性があります。しかし、perl-renameはインストールできます。
prosoitos

15

shを使用...

for i in *' '*; do   mv "$i" `echo $i | sed -e 's/ /_/g'`; done

トリガーを引く前にこれを試してみたい場合は、に変更mvしてくださいecho mv


4

bashを使用する場合:

for file in *; do mv "$file" ${file// /_}; done

私が試したとき、mvを取得しました。複数のファイルを移動するとき、最後の引数はディレクトリでなければなりませんmv --help' for more information. mv: when moving multiple files, last argument must be a directory Try 。詳細については、mv --help 'を試してください。
Mithun Sreedharan

もう一度エラーmv:欠落ファイル引数mv --help' for more information. mv: missing file argument Try 詳細についてはmv --help 'を試してください。mv:ファイル引数がありませんmv --help' for more information. mv: missing file argument Try 詳細については、mv --help 'を試してください。
Mithun Sreedharan

@ levislevis85:Thx、それを知らなかった。
soulmerge 2009年

4

置換タスクを再帰的に適用したい場合はどうなりますか?どうしますか

さて、私は自分で答えを見つけました。最もエレガントな解決策ではありませんが(条件に適合しないファイルの名前も変更しようとします)、機能します。(ところで、私の場合、ファイル名をアンダースコアではなく '%20'に変更する必要がありました)

#!/bin/bash
find . -type d | while read N
do
     (
           cd "$N"
           if test "$?" = "0"
           then
               for file in *; do mv "$file" ${file// /%20}; done
           fi
     )
done

2

すべてのファイルが.txtであると想定して、次のようなことを試してください。

for files in *.txt; do mv “$files” `echo $files | tr ‘ ‘ ‘_’`; done

2
以下のエラーtrを受け取りました:mvの翻訳時に2つの文字列を指定する必要があります:ファイル引数がありません詳細については、 `mv --help 'を試してください。
Mithun Sreedharan

2
Agin error tr:too many arguments tr --help' for more information. mv: missing file argument Try 詳細については、mv --help 'を試してください。
Mithun Sreedharan

2

ここに別の解決策があります:

ls | awk '{printf("\"%s\"\n", $0)}' | sed 'p; s/\ /_/g' | xargs -n2 mv
  1. awkを使用してファイル名を引用符で囲みます
  2. sedを使用して、スペースをアンダースコアに置き換えます。元の名前を引用符付きで出力します(awkから)。次に、置換された名前
  3. xargsは一度に2行取り、mvに渡します

1

変数を引用します。

for file in *; do echo mv "'$file'" "${file// /_}"; done

実際の名前変更を行うには、「エコー」を削除します。


それはmvコマンドをより正確にエコーしますが、実際にはファイルの名前を変更していません!
Mithun Sreedharan

エコーを削除すると、mv:cannot stat \'1130 lake micigan view.jpg\'': No such file or directory mv: cannot stat \ '1130_1_bedroom_floor_plan.jpg \' ':no stat \'1130_BedPicture_8.jpg\'': No such file or directory mv: cannot stat or file' \ '1130_diningroom_table.jpg \' ':No such file or directory
Mithun Sreedharan

Linux Linux 2.6.9-42.0.3.EL.wh1smp#1 SMP金8月14日15:48:17 MDT 2009 i686 i686 i386 GNU / Linux
Mithun Sreedharan

1

で文字列(ここではスペース文字)を別の文字列に置き換える最も簡単な方法Linuxは、を使用することsedです。あなたは次のようにそれを行うことができます

sed -i 's/\s/_/g' *

お役に立てれば。


これは問題に対処していません。
amit


0

.py拡張子を使用してすべてのファイルの名前を変更するには、 find . -iname "*.py" -type f | xargs -I% rename "s/ /_/g" "%"

出力例、

$ find . -iname "*.py" -type f                                                     
./Sample File.py
./Sample/Sample File.py
$ find . -iname "*.py" -type f | xargs -I% rename "s/ /_/g" "%"
$ find . -iname "*.py" -type f                                                     
./Sample/Sample_File.py
./Sample_File.py
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.