Linuxシェルを使用してスペースを含むファイルの名前を変更するにはどうすればよいですか?


28

スペースを含む多くのファイルに名前を付け、スペースをに置き換えたいと思い_ます。ただし、シェルでファイル名(例:)を使用してコマンドを作成するたびSpring 2011に、シェルはファイルまたはディレクトリを認識しません。

これについて何ができますか?スペースにユニコード文字を使用する方法はありますか?


プログラムでNファイルの名前を変更するには、bashforループを使用しますこちらのソリューションをご覧ください
トレバーボイドスミス

回答:


33

たとえばSpring\ 2011、スペースをエスケープするか、たとえば引用符を使用します'Spring 2011'。将来的には、* NIXでスペースを含むファイル名を使用することは一般的に悪い考えです。

持っている場合rename、これを使用できます:

rename ' ' '_' [filenames...]

1
とにかく一度にすべてのファイルに対してこれを行うことを知っていますか?

3
なぜ悪い考えですか?ファイル名を適切に処理するのはプログラマの責任です。
グレンジャックマン

1
@rafe、実際には、ファイル名を前もって適切に処理しないとエラーになります。ファイル名を含む変数を引用符で囲むのを忘れたときにスクリプトをデバッグする必要がある場合、余分な労力がかかります。
グレンジャックマン

3
この回答は機能していないようです(少なくともUbuntu 12.04 LTSでは)。しかし、unutbuからの答えはうまくいきます。
DNA

1
これは私のために最初のスペースを作っただけです... rename役に立たない(私はバージョン2.23 があります)
トレバーボイドスミス

30

マシンにrenameコマンドがある場合、これは現在の作業ディレクトリ内のすべてのファイル/ディレクトリ内のすべてのスペースをアンダースコアに変更します。

rename 's/ /_/g' *

Ubuntu 12.04
anthonygore 14年

1
私のために動作しませんでした... "名前を変更:引数が足りません"というエラーが表示されました。バージョンがありrename --version rename from util-linux 2.23.2ます。
トレバーボイドスミス

24

renameシェルだけを使用していない、または使用したくない場合:

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

分解:

  • *\ *名前にスペースを含むすべてのファイルをforループの入力として選択します。
  • "$f"ファイル名にスペースが含まれていることがわかっているため、引用符は重要mvです。
  • ${f//str/new_str}bash固有の文字列置換機能です。のすべてのインスタンスがstrに置き換えられますnew_str

2
これは機能しますが、私にとっては最初のスペースのみを置き換えます。私はfor f in *\ *; do mv "$f" "${f// /_}"; doneそれを使用する場合
ビリーノア14

@billynoah良いキャッチ、更新。
blahdiblah

@blahdiblahありがとうございます!あなたは私をとても節約しました!
ゲリラ

@blahdiblahあなたのソリューションは私のソリューションよりもずっとエレガントです。よくやった。forループglobが機能するとは思わなかったので、forループの外側でglobを実行しました。
トレバーボイドスミス

3

mv "Spring 2011.file" Spring_2011.file コマンドラインに、引用符で囲まれた文字列を単一の入力として取得するように指示する必要があります。


これが仕事に就くことができる唯一の答えです。
ブレイコフト

1

プログラムでNファイルの名前を変更するには、単純なbashforループを使用できます。

#!/bin/bash

set -eux

# find all your files by using a `grep` pattern
pattern="insert_filename_pattern_here" # you must enter your filename pattern here

# create an array of filenames and split on newlines
IFS=$'\n'
tmp=($(ls | grep ${pattern}))
unset IFS

# for each filename
for filename in "${tmp[@]}"; do
    # rename the filename to use "_" character instead of a " " character
    mv -v "${filename}" "${filename// /_}"
done

ファイル名が5つ未満の場合は、すべてのファイル名を手動で入力しrename、上記の解決策が示すようなコマンドを使用できます。しかし、私にとっては... 4つのファイルしかない場合でも、プログラムによる解決策を好みます。

PS

Bashのパラメータ拡張(つまり${filename// /_})に慣れていない場合は、rename次のコマンドを使用できます。

if ((0)); then
    mv -v "${filename}" "${filename// /_}"
else
    rename ' ' '_' "${filename}"
fi
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.