2010-11-24 10 views
3

すべてのディレクトリとファイルの名前をシェルスクリプトで大文字に変更しようとしています。私の作品はありますが、サブディレクトリはありません。スクリプトの実行中にディレクトリ名が変更されると、mv: cannot stat './def/two/three': No such file or directoryUNIXファイル/ディレクトリの名前を大文字に変更

私は-depthを使って検索しましたので、下から上に名前が変更されます。しかし、それでも同じ問題に遭遇します。私はcutを使用して、/のパスを分割して名前を変更しますが、紛失してしまいます。ここで

は私が持っているものです。

​​

私はこのように感じるような一般的なタスクである必要があり、任意の方向に感謝しますが、いくつかのGoogle検索からのワーキング解決策を見つけることができなかったでしょう。

renameはディストリビューションでサポートされていないため、使用できませんのでご注意ください。

+0

私はスーパーユーザへの移行を提案します。 – Teddy

+1

Perlをお持ちの場合、 'rename'は非常にシンプルなPerlスクリプトです。バイナリの代わりに使うことができます(これは強力ではありません)。だから、ファイルやディレクトリの名前を変更することについては数十もの質問がありますが、それについてもいくつか深いところがあります(http://stackoverflow.com/search?q=%2Brename+%2Bdepth)。 –

+0

[すべてのフォルダとファイルの名前をLinux上で小文字にする方法は?](http://stackoverflow.com/questions/152514/how-to-rename-all-folders-and-files-to-lowercase-on -linux) –

答えて

8

にこの方法を試してみてください:

find . -depth |while read LONG; do SHORT=$(basename "$LONG" | tr '[:lower:]' '[:upper:]'); DIR=$(dirname "$LONG"); if [ "${LONG}" != "${DIR}/${SHORT}" ]; then mv "${LONG}" "${DIR}/${SHORT}" ; fi; done 

か、あなたが読みやすいVをしたい場合(1行なし):

これは、適切な順序でファイルの名前を変更し、そのディレクトリを正しい順序で変更します。

+0

"$(FOO)"や "$ FOO"のように*すべて* $(FOO)と$ FOOを引用する必要があります。 – Teddy

+0

@Teddy:あなたが正しいです、私は2 $ LONGを引用する必要がありました。今修正されました。私は逃したとは思わない。 – Baramin

+0

これは機能します。 '$ LONG'と' $ {DIR}/$ {SHORT} 'が一致すれば、 'mv'はエラーを投げることに注意してください。将来のstumblersについては、比較チェックを追加することでこの問題を解決できます。 –

0

私はあなたがしてDIR2で名前変更を開始すべきだと思うあなたは、このディレクトリ構造
/どこか/ somethimg/
/どこか/ somethimg/dir1の
/どこか/ somethimg/DIR1/DIR2

を持って言うことができますDIR1に行くので、

+0

これは、私の質問に記載されているように動作しなかった深さの最初の検索になります。 –

0

このスクリプトは、動作させるために、現在のパスのすべてのファイル/ディレクトリの名前を「リー​​フ」に変更する必要があります。

#!/bin/bash 

IFS=$'\n'; 
TMP=/tmp/file_list 
rm -f ${TMP}; 

for file in `find .` 
do 
num=`echo $file | grep -o "/" | wc -l`; 
echo "$num $file" >> ${TMP}; 
done 

sort -n -r ${TMP} | cut -f 2 -d ' ' > ${TEMP}.temp; 

for file in `cat ${TEMP}.temp` 
do 
echo $file; 
## Code to rename file here. All subdirectories would already have been renamed 
done 
+0

+1です。私はそれを徹底的にテストしなかったが、うまくいくようだ。あなたは '$ TEMP'を' $ TMP'に変更する必要があります。 –

+0

これは特殊文字(空白、 '\ [*?])を含むファイル名を詰まらせるでしょう。一時ファイルを安全に使用していないため、運用準備が整っていません。まず、変数置換( '$ var')とコマンド置換(' \ 'command \' ')を二重引用符で囲みます。 'find -exec'を使用してください。ソートのステップは役に立たず、 'find -depth'で読んでください。 – Gilles

+0

どうやら、-depthオプションが分かっていませんでした。 –

関連する問題