Linux-ファイル名のスペースを置き換える
質問
フォルダ内に多数のファイルがあり、すべてのファイル名のすべてのスペース文字をアンダースコアに置き換えたい。どうすればこれを達成できますか?
解決
これでうまくいくはずです:
for file in *; do mv "$file" `echo $file | tr ' ' '_'` ; done
他のヒント
Perlスタイルの正規表現を使用するコマンド 'rename'を使用することを好みます:
rename "s/ /_/g" *
-nフラグを使用してドライランを実行できます。
rename -n "s/ /_/g" *
sh ...を使用...
for i in *' '*; do mv "$i" `echo $i | sed -e 's/ /_/g'`; done
トリガーを引く前にこれを試してみたい場合は、 mv
を echo mv
に変更してください。
置換タスクを再帰的に適用する場合はどうなりますか?どうしますか?
まあ、私は自分で答えを見つけました。最もエレガントな解決策はありません(条件を満たさないファイルも名前を変更しようとします)が、機能します。 (ところで、私の場合、ファイル名をアンダースコアではなく '%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
bashを使用する場合:
for file in *; do mv "$file" ${file// /_}; done
変数の引用:
for file in *; do echo mv "'$file'" "${file// /_}"; done
" echo"を削除します実際の名前変更を行います。
すべてのファイルが.txtであると仮定して、このようなことを試してください:
for files in *.txt; do mv “$files” `echo $files | tr ‘ ‘ ‘_’`; done
Linux
で文字列(ケースの場合はスペース文字)を別の文字列に置き換える最も簡単な方法は、 sed
を使用することです。次のようにできます
sed -i 's/\s/_/g' *
これがお役に立てば幸いです。
別のソリューションを次に示します。
ls | awk '{printf("\"%s\"\n", <*>)}' | sed 'p; s/\ /_/g' | xargs -n2 mv
- awkを使用して、ファイル名を引用符で囲みます
- sedを使用してスペースをアンダースコアに置き換えます。引用符付きの元の名前を出力します(awkから)。置換された名前
- xargsは一度に2行を受け取り、それをmvに渡します
あなたの答えは ファイル名のスペースをアンダースコアに置き換えます 。
拡張子が .py
のすべてのファイルの名前を変更するには、
<コード>
見つける。 -iname&quot; *。py&quot;タイプf | xargs -I%rename&quot; s / / _ / g&quot; &quot;%&quot;
サンプル出力、
$ 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