名前の先頭にアンダースコア「_」文字を含めるには、ディレクトリ内の複数のディレクトリの名前を変更する必要があります。
テストとして、コンテンツに3つのディレクトリを含む親ディレクトリを作成しました。
dir1, dir2 and dir3; three files: file1, file2, file3
3つのドットプレフィックスファイル:
.file1, .file2, .file3
これまで、以下を使ってMacにインストールしてみましたgfind
。findutils
gfind . -type d -name '*' -printf "mv \"%h/%f\" \"%h/_%f\"\n" | sh
これにより、次のものが返されます。
mv: rename ./. to ./_.: Invalid argument
だから名前の変更と検索を試してみました。
find . -type d -exec rename 's/^/_/' {} \;
これにより、次のものが返されます。
Can't rename '.' to '_.': Invalid argument
Can't rename './dir1' to '_./dir1': No such file or directory
Can't rename './dir2' to '_./dir2': No such file or directory
Can't rename './dir3' to '_./dir3': No such file or directory
誰もが動作する解決策を持っているか、私が間違っている可能性がある部分を知っていますか?
ベストアンサー1
私が正しく推測した場合は、次のファイルとディレクトリがあります。
$ mkdir dir{1,2,3} ; touch file{1,2,3} .file{1,2,3}
$ ls -A
.file1 .file2 .file3 dir1 dir2 dir3 file1 file2 file3
ディレクトリ名を_dir1
、、_dir2
に変更したいですか_dir3
?
それはfind
/printf mv
実現可能に見える。それが何を印刷するのか見てみましょう:
$ find . -type d -name '*' -printf "mv \"%h/%f\" \"%h/_%f\"\n"
mv "./." "./_."
mv "./dir2" "./_dir2"
mv "./dir3" "./_dir3"
mv "./dir1" "./_dir1"
最初のコマンドは、「ドット」が特別で名前を変更できないため、エラーを発生させます。しかし、他のものは問題なく、必要に応じてディレクトリの名前を変更する必要があります。
$ find . -type d -name '*' -printf "mv \"%h/%f\" \"%h/_%f\"\n" | sh
mv: cannot move ‘./.’ to ‘./_.’: Device or resource busy
$ ls -d _dir*
_dir1 _dir2 _dir3
ただし、シェルにコマンドをパイプするのは少し見苦しく、ファイル名が十分に奇妙な場合、結果は驚くでしょう(たとえば、シェルで変数またはコマンドの置換をトリガーする$
シンボルが含まれている場合)。
ファイルがすべて 1 つのレベルにある場合は、次のことを行う必要があります。
for x in * ; do [ -d "$x" ] && mv "$x" "_$x" ; done
_$x
(すでに存在していても、$x
その位置に移動されます。)
名前がドットで始まるディレクトリを含めるには、あらかじめ使用してくださいshopt -s dotglob
。
これも近いです:
find . -type d -exec rename 's/^/_/' {} \;
ただし、で始まるパスがfind
提供されるため、これを考慮する必要があります。 1つのレベルでのみ機能します(先行をに変更)。rename
./
./
./_
find . -type d -exec rename 's,^./,./_,' {} \;
すべてのレベルのディレクトリを取得するには、find -execdir
おそらく最も使いやすい方法です。ファイルディレクトリからコマンドを実行します。-depth
名前の変更を正しい順序で処理する必要があります。
find . -depth -type d -execdir rename 's,^./,./_,' {} \;
たぶんそれも追加できます! -name .
。例えば
$ mkdir foo foo/dir1 foo/dir2
$ find . -depth \! -name . -type d -execdir rename 's,^./,./_,' {} \;
$ ls _foo
_dir1 _dir2