サブディレクトリの名前を変更せずに、ディレクトリ内のすべてのファイル名を小文字に変更したいと思います。名前変更機能について知っていますが、ファイルとサブディレクトリの名前を変更することはお勧めできません。助けてください?
答え1
Perl式ですべての操作を実行できます。
-f
通常のファイル(ディレクトリではない)のみ名前が変更されるように、一般的なファイルテストを使用してください。
これは働きます:
rename 'y/A-Z/a-z/ if -f;' ./*
(./*
notを使用すると、*
ファイル名がダッシュ(-)で始まってもファイル名はオプションとして解釈されません。
答え2
そしてzsh
:
autoload zmv # best in ~/.zshrc
zmv '*(#q^/)' '${(L)f}'
ディレクトリを除くすべての種類のファイル名を変更します。または:
zmv '*(#q.)' '${(L)f}'
通常のファイルのみ名前が変更されます。隠しファイルを含めるには、D
glob修飾子を追加してください。
はい(-n
テスト実行用):
$ ls -alQF
total 132
drwxr-xr-x 3 stephane stephane 4096 Oct 27 09:11 "."/
drwxr-xr-x 533 stephane stephane 122880 Oct 27 09:11 ".."/
drwxr-xr-x 2 stephane stephane 4096 Oct 27 09:07 "DIR"/
lrwxrwxrwx 1 stephane stephane 3 Oct 27 09:07 "DIR-LINK" -> "DIR"/
prw-r--r-- 1 stephane stephane 0 Oct 27 09:07 "FIFO"|
-rw-r--r-- 1 stephane stephane 0 Oct 27 09:11 ".HIDDEN FILE"
-rw-r--r-- 1 stephane stephane 0 Oct 27 09:07 "HOLIDAYS IN МОСВА\nRED SQUARE.JPG"
lrwxrwxrwx 1 stephane stephane 23 Oct 27 09:08 "MY-RÉSUMÉ.PDF" -> "STÉPHANE'S RÉSUMÉ.PDF"
-rw-r--r-- 1 stephane stephane 0 Oct 27 09:07 "--READ-ME--.TXT"
srwxr-xr-x 1 stephane stephane 0 Oct 27 09:09 "SOCKET"=
-rw-r--r-- 1 stephane stephane 0 Oct 27 09:07 "STÉPHANE'S RÉSUMÉ.PDF"
$ zmv -n '*(#q^/)' '${(L)f}'
mv -- DIR-LINK dir-link
mv -- FIFO fifo
mv -- HOLIDAYS\ IN\ МОСВА$'\n'RED\ SQUARE.JPG holidays\ in\ мосва$'\n'red\ square.jpg
mv -- MY-RÉSUMÉ.PDF my-résumé.pdf
mv -- --READ-ME--.TXT --read-me--.txt
mv -- SOCKET socket
mv -- STÉPHANE\'S\ RÉSUMÉ.PDF stéphane\'s\ résumé.pdf
$ zmv -n '*(#q.)' '${(L)f}'
mv -- HOLIDAYS\ IN\ МОСВА$'\n'RED\ SQUARE.JPG holidays\ in\ мосва$'\n'red\ square.jpg
mv -- --READ-ME--.TXT --read-me--.txt
mv -- STÉPHANE\'S\ RÉSUMÉ.PDF stéphane\'s\ résumé.pdf
$ zmv -n '*(#qD.)' '${(L)f}'
mv -- .HIDDEN\ FILE .hidden\ file
mv -- HOLIDAYS\ IN\ МОСВА$'\n'RED\ SQUARE.JPG holidays\ in\ мосва$'\n'red\ square.jpg
mv -- --READ-ME--.TXT --read-me--.txt
mv -- STÉPHANE\'S\ RÉSUMÉ.PDF stéphane\'s\ résumé.pdf
これらのいくつかがいくつかのシンボリックリンクをどのように壊すかを確認してください。
答え3
varを小文字にフォーマットすると、小文字に変換できます。
編集:ソリューションfind
をfor
。
最初に試した解決策find
は-type f
。-maxdepth 1
typeset -l smallfile
echo "Find solution looks OK but read more..."
find .-maxdepth 1 -type f| while read file; do
smallfile="${file}"
mv "${file}" "${smallfile}"
done
私の考えでは、この構造は空白のあるファイル名を正しく処理すると思います。 「空白のあるファイル」などのファイル名でテストしました。 @Chazelasは、ファイル名が空白(「あまりにも悪い」)で終わるため、この解決策が失敗すると正しく言及しました。別の意見では、修正方法について説明します。find
- command: (サポートするfind ... -print0 | while IFS= read -rd '' file
必要があるもの 、主におよび )。すでにループを使用しているので、を使用して現在の項目(で提供)が通常のファイルであることを確認することもできます。単純なforループを持つソリューションを見つけて、テストコードを含むここに表示します。find
print0
bash
zsh
test
*
#!/bin/bash
clear
rm -rf testfiles 2>/dev/null
mkdir -p testfiles/SomeDir #2>/dev/null
mkdir testfiles/"Crazy Dir" 2>/dev/null
touch testfiles/Aha testfiles/"File with Spaces" testfiles/"End with space "
ls -lQ testfiles
echo ===================
typeset -l smallfile
for file in testfiles/* # Stack's formatting thinks /* starts comment, so I close that here: */
do
if [ -f "${file}" ]; then
smallfile="${file}"
# echo mv "${file}" "${smallfile}"
mv "${file}" "${smallfile}"
fi
done
echo ===================
ls -lQ testfiles
現在のディレクトリの場合は、testdir/
forループから削除してください。
答え4
このオネライナーはこの問題を解決します。
find path-to-search -depth -type f -exec rename 's/(.*)\/([^\/]*)/$1\/\L$2/' {} \;
ああ!