ファイル名にスペースを含むファイル(ディレクトリを含む)を検索して名前を変更する

ファイル名にスペースを含むファイル(ディレクトリを含む)を検索して名前を変更する

私のext4ファイルシステムには、ファイル名にスペースがあるファイルとディレクトリがたくさんあります。

安全に見つけて名前を変更するにはどうすればよいですか?私はbashを持っていて、Ubuntuを実行しています。

見つかった各ファイルの名前をインタラクティブに変更することは可能ですか?つまり、各ファイルの内容の名前を何に変更するのか尋ねます。

ファイル名を選択して名前を変更するには、どのルールを使用しますか?

答え1

このスクリプトは、ターゲットディレクトリ内のすべてのファイルを検索し、スペースを含めないようにすべてのファイルの名前を変更する新しいスクリプトを生成します。その後、スクリプトを実行する前に自由に確認できます。

#!/bin/bash
TARGET=/path/to/files
NEWSCRIPT=${HOME}/rename-spaced-files.sh

OLDIFS="${IFS}"
IFS="\n"
for file in $(find ${TARGET}/ -type f -name "* *"); do
    if [[ -f \"${file// /}\" ]]; then
        echo "# \"${file// /}\" already exists- come up with a new name for it and uncomment the next line" >> $NEWSCRIPT
        echo -n "# " >> $NEWSCRIPT
    fi
    echo "mv \"${file}\" \"${file// /}\"" >> $NEWSCRIPT

done

答え2

各ディレクトリに名前変更を使用するのは簡単です。

rename 's/\s/_/g' *

これにより、ディレクトリのファイル名からすべてのスペースが削除され、「_」に置き換えられます。 「g」を省略すると、ファイル名の最初のスペースだけが置き換えられるので、その部分を忘れないでください。 * は、実行されるディレクトリ内のすべてのファイルを意味します。

rename 's/\s/_/g' /home/you/something/*

ディレクトリ内のファイル名のすべてのスペースを置き換えます。/home/you/something/

これには多くのディレクトリを巡回することは含まれていませんが、これは私が通常行うことです。

私は下線が好きです。このように変更されます。

my file with spaces.txt

到着

my_file_with_spaces.txt

答え3

スペースを含むファイル名はUnixとそのファイルシステムで完全に許可されていますが、シェルコマンドや変数(スクリプトなど)で使用する場合は、これらの名前を引用するときに注意する必要があります。それ以外の場合、シェルは各単語を別々の引数としてコマンドに渡します。

VAR="existing file with spaces in name"

#This works
ls "${VAR}"

#This results in file(s) not found
ls ${VAR}

すでに提供されている回答に加えて、次のものを使用することもできます。mmvmmvとにかくソースパターンとターゲットパターンを引用する必要があるため、このコマンドは名前のスペースに関係なく、名前がパターンと一致する複数のファイルの名前を変更します。

そして恥ずかしいです。私の言葉を引用すると(意図した悪戯ではありませんが受け入れられます):

経験則:いつも文字列を含むシェル変数を展開するときは、引用符を使用してください。空白が含まれているか空白になる可能性があり、引用符がないと、渡されたコマンドが混乱することがよくあります(引数が多すぎるか、引数が欠落しています)。

関連情報