2016-10-03 4 views
1

私はそれらがうまくいくようないくつかの答えを見つけましたが、ディレクトリ名からドットを削除しようとするスクリプトを実行すると、ドットは引用にかかわらずスクリプトを混乱させるようです。例えば、私はs. om. e dir (25)という名前のディレクトリでこれを試してみました:ディレクトリ名(シェル)からすべてのドットを削除

for dir in $(find . -type d -maxdepth 1 -name *.*); do 
    mv "$dir" `echo "$dir" | tr '.' '_'` 
done 

と端末でこの出力を得る:

mv: rename ./s. to _/s_: No such file or directory 
mv: rename om. to om_: No such file or directory 
mv: rename e to e: No such file or directory 
mv: rename dir to dir: No such file or directory 
mv: rename (25) to (25): No such file or directory 

どのように私が壊すコードなしs. om. e dir (25)からs_ om_ e dir (25)にディレクトリの名前を変更することができますドットの各インスタンス?

+0

名前を変更してください。 _ */'。 – alvits

答えて

2

あなたがrenameのPerlのバージョンをお持ちの場合は、単にそれ以外の場合は

rename 'tr/./_/' *.*/ 

を行うことができ、

for i in *.*; do 
    [ -d "$i" ] || continue 
    mv -- "$i" "${i//./_}" 
done 

が動作するはずです。

+0

ありがとう!私はアクセス可能なボックスにperlを持っていないようで、管理者がインストールするのを永久に待っている気がなかったので、bash 'for'ループに感謝します!魅力のように働いた。 –

3

代わりのecho | tr、あなたは単にパラメータ置換を使用することができます。

mv -- "$dir" "${dir//./_}" 

あなたが代わりにプロセス置換でforループのwhileループを使用する必要があります。

while IFS= read -r -d '' dir; do 
    mv -- "$dir" "${dir//./_}" 
done < <(find . -type d -maxdepth 1 -name '*.*' -print0) 

あなたはまた、あなたを引用すべきですファイルパターンはfindです。また

、あなただけの現在のディレクトリ内のディレクトリを反復しているので、あなたはこのglobを使用することができます。問題はfindの出力にfor/inを使用している

for dir in *.*/; do 
    mv -- "$dir" "${dir//./_}" 
done 
+0

これは実際に動作しますか( 'IFS =' with '-print0')ですか? – melpomene

+0

はい、間違いなく動作しますが、問題はありますか? – anubhava

関連する問題