ディレクトリ内の特殊文字とスペースを含むすべてのファイルの名前を変更するにはどうすればよいですか?


10

名前に空白スペースと特殊文字($と@)が含まれている特定のディレクトリにあるすべてのファイルの名前を変更するにはどうすればよいですか?

rename次のコマンドを試して、すべてのスペースと特殊文字を_に置き換えました。

$ ls -lrt
total 464
-rwxr-xr-x. 1 pmautoamtion pmautoamtion 471106 Jul 17 13:14 Bharti Blocked TRX Report Morning$AP@20150716.csv


$ rename -n 's/ |\$|@/_/g' *
$ ls -lrt
total 464
-rwxr-xr-x. 1 pmautoamtion pmautoamtion 471106 Jul 17 13:14 Bharti Blocked TRX Report Morning$AP@20150716.csv
$

コマンドは機能しますが、ファイル名に変更を加えたり、エラーを返したりすることはありません。どうすればこれを修正できますか?他の方法もありますか?


1
perl名前変更スクリプト(ref:manpages.ubuntu.com/manpages/dapper/man1/prename.1.html)を期待しているかもしれませんが、代わりにutil-linux renameを取得していますが、これは同じように機能しません。
Jeff Schaller

回答:


10

-nフラグのためにあります

-何もしない

アクションなし:名前が変更されるファイルを表示します。

変更がない場合は正常です。

あなたのコマンドに関しては、それは私のために働いています:

$ touch "a @ test"
$ ls
a @ test
$ rename -n 's/ |\$|@/_/g' *
a @ test renamed as a___test

多分あなたのシェルに依存します、あなたはエスケープする必要があります|

$ rename -n 's/ \|\$\|@/_/g' *

または、[…]表記法を使用して文字をグループ化できます。

$ rename -n 's/[ @\$]/_/g' *

1
-nオプションなしで3つすべてを試しましたが、それでもファイル名は変更されません。上記の3つのタイプのいずれについても、エラーは発生しません。名前変更コマンドが何らかの理由で機能しない可能性があります。名前にスペースまたは$または@が含まれるディレクトリ内のすべてのファイルを変更する他の方法はありますか?
Ankit Vashistha 2015

@AnkitVashisthaはrename -n 's/./_/g' *何かを出力しますか?
fredtantini、2015

何も出力せず、出力もエラーもありません。次のコマンドラインに着地するだけです。
Ankit Vashistha 2015

名前の変更も(スペース)またはを置き換えるために私のために働いていません「:」のUbuntu 18.04に、バッシュ4.4.20(1)-release
Ouss

7

あなたはこのように試すことができます:

for file in ./*Block*                                       
do echo mv "$file" "${file//[ ()@$]/_}"
done

結果に満足したら、echomvを削除して実際にファイルの名前を変更します。


私が経験した中で最高の解決策の1つであり、私はこれを長い間試みてきました
Sushin Pv

2

特殊文字とドイツ語の特殊文字を削除するハンサムなスクリプトを探して、有用な情報を削除しないようにそれらをユニバーサルな文字に置き換えます。スクリプトの最新バージョンを更新しました。

#!/bin/bash

for file in ./*
do
  infile=`echo "${file:2}"|sed  \
         -e 's|"\"|"\\"|g' \
         -e 's| |\ |g' -e 's|!|\!|g' \
         -e 's|@|\@|g' -e 's|*|\*|g' \
         -e 's|&|\&|g' -e 's|]|\]|g' \
         -e 's|}|\}|g' -e 's|"|\"|g' \
         -e 's|,|\,|g' -e 's|?|\?|g' \
         -e 's|=|\=|g'  `
  outfileNOSPECIALS=`echo "${file:2}"|sed -e 's|[^A-Za-z0-9._-]|_|g'`
  outfileNOoe=`echo $outfileNOSPECIALS| sed -e 's|ö|oe|g'`
  outfileNOae=`echo $outfileNOoe| sed -e 's|ä|ae|g'`
  outfileNOue=`echo $outfileNOae| sed -e 's|ü|ue|g'`
  outfileNOOE=`echo $outfileNOue| sed -e 's|Ö|OE|g'`
  outfileNOAE=`echo $outfileNOOE| sed -e 's|Ä|AE|g'`
  outfileNOUE=`echo $outfileNOAE| sed -e 's|Ü|UE|g'`
  outfileNOss=`echo $outfileNOUE| sed -e 's|ß|ss|g'`
  outfile=${outfileNOss}
  if [ "$infile" != "${outfile}" ]
  then
        echo "filename changed for " $infile " in " $outfile
        mv "$infile" ${outfile}
  fi
done

exit

その結果:

ここに画像の説明を入力してください

@don_crissti:Linuxでは、ファイル名を移動するときに特殊文字を処理する際に独自の問題があるため、infileでhokus-pokusを実行しています。


1
特殊文字?どれ ?
don_crissti 2017

スペース、シンボル、アンパサンド....
マティアスR.ウィオラ

特殊文字(改行を含む)を含む名前のファイルを移動しても問題はありません ...おそらくシェルに慣れていないでしょう(そして、ところで、これはLinuxとは何の関係もなく、シェルの機能です...) )
don_crissti 2017

mh大丈夫-あなたは多分正しいです
マティアスR.ウィオラ

1

以来renameコマンドが未知の理由のために私のために動作しませんでしたし、私は私の質問のための任意の他の回答を得ることはありません、私自身は、名前の変更を可能にするための努力を作ってみました。これはファイルの名前を変更するための最良の方法ではないかもしれませんが、私にとってはうまくいきました。これが答えとして投稿したいので、他の誰かがこれを読んだ場合、私が行った方法でファイル名を変更するための助けを得ることができます。

これで私は、すべてのファイルの名前に「ブロック」という特定のテキストが含まれることを知っています。以下は、名前変更が行われる前のファイル名です。

anks@anks:~/anks$ ls -lrt
total 4
-rw-r--r-- 1 anks anks   0 Jul 25 14:47 Bharti TRX Block Report$AP@12Jul15.csv
-rw-r--r-- 1 anks anks   0 Jul 25 14:47 Bharti TRX Block Report$HP@12Jul15.csv
-rw-r--r-- 1 anks anks   0 Jul 25 14:47 Bharti TRX Block Report$CH@12Jul15.csv
-rw-r--r-- 1 anks anks   0 Jul 25 14:47 Bharti TRX Block Report$KK@12Jul15.csv
-rw-r--r-- 1 anks anks   0 Jul 25 14:48 Bharti TRX Block Report$UW@12Jul15.csv

これを可能にする小さなシェルスクリプトを作成しました。コードは次のとおりです。

#!/bin/bash

PATH="/home/ebfijjk/anks"

# Put the old filenames in a file.
ls $PATH | grep Block >> oldValues

# Put the new names without " " or "@" or "$" in another file
cat oldValues | sed 's/\$/_/g' | sed 's/\@/_/g' | sed 's/ /_/g' >> newValues

# Create a new file with Old names and New names seperated by a #.
paste -d'#' oldValues newValues >> oldAndNew

# Read the file with both old and new names and rename them with the new names.
while IFS='#'; read oldValue newValue
do
    mv "$oldValue" "$newValue"

done < oldAndNew

rm oldValues newValues oldandNew

それだけです。スクリプトを実行すると、これらの文字の代わりに、空白()または$or @を含むすべてのファイル名が変更されます_


あなたは置き換えることができますcat foo | sed S1 | sed S2 | sed S3 >> barsed -e S1 -e S2 -e S3 foo >> bar
Archemar

2
@Archemar -あるいは単にsed 's/[ ()@$]/_/g'またはsed 'y/ ()@$/_____/'
don_crissti

コメントと提案をしてくれたdon_crisstiとArchemarに感謝します。
Ankit Vashistha

1

これはファイル名から特殊文字を取り除くだけです

for file in *; do mv "$file" `echo $file | tr -cd '.A-Za-z0-9_-'` ; done
Námásté Egész-ség.mkv --> NmstEgsz-sg.mkv

次のように前にテストするためにecho; doを置きます:

for file in *; do echo mv "$file" `echo $file | tr -cd '.A-Za-z0-9_-'` ; done

別の解決策:

rename -v 's/[^a-zA-Z0-9\.\s_-]//g' *.* && rename -v 's/[\s]/_/g' *.*
Námásté Egész-ség.mkv --> Nmst_Egsz-sg.mkv

-n 前にテストするオプション。


0

私はこの問題の解決策をしばらく探していました。新しいパッケージをインストールできない古いクローズドシステムで作業しています。私にはrename命令がありません。最後に、キーボードで入力されたすべての特殊文字で動作するように見えるスクリプトを書きました。 ~@#$%^&*()-_=+[]{}\|;:",<.>?' スクリプトは、現在のディレクトリ内のすべてのファイルとディレクトリの名前を変更します。それは除いて、すべての特殊文字を置き換えます-_._文字。outfile=ラインは、必要に応じて交換のために別の文字を使用するように変更することができます。置き換え|_||.|使用するために.、たとえば文字を。

#!/bin/bash

for file in ./*
do
  infile=`echo "${file:2}"|sed  \
         -e 's|"\"|"\\"|g' \
         -e 's| |\ |g' -e 's|!|\!|g' \
         -e 's|@|\@|g' -e 's|*|\*|g' \
         -e 's|&|\&|g' -e 's|]|\]|g' \
         -e 's|}|\}|g' -e 's|"|\"|g' \
         -e 's|,|\,|g' -e 's|?|\?|g' \
         -e 's|=|\=|g'  `
  outfile=`echo "${file:2}"|sed -e 's|[^A-Za-z0-9._-]|_|g'`
  mv "$infile" ${outfile} &
done

exit

0

Ubuntu 18.04 LTSでbash 4.4.20(1)-releaseを使用している場合、このワンライナーはスペース、@ 、:#...を削除するのに効果的でした。

テストするには(echoコマンドに注意してください:

for file in ./* ; do if [[ $file == *['!'\ :@#]* ]]; then echo mv "$file" "${file//[ #()@$:]/_}"; fi; done

実行するには:

for file in ./* ; do if [[ $file == *['!'\ :@#]* ]]; then echo mv "$file" "${file//[ #()@$:]/_}"; fi; done
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.