2017-01-21 18 views
-1

ファイルを整理するためのシェルスクリプトを作成しています。現時点では、それをテストするのに十分な種類の種類はサポートしていません。ワークフローはこれです:シェルスクリプトが特定の状況で空のディレクトリを削除しない

  1. は、すべての空のフォルダのファイルの他のタイプの

    を繰り返し、この削除ワイルドカード

  2. でアイテム

  3. 移動し、すべてのアイテムの種類のためのフォルダを作成します。

現在のところ、ディレクトリ削除部は何も格納されていなければ機能します。したがって、スクリプトを実行して何もフォルダに移動しなかった場合、最初の実行中に削除されます。ただし、フォルダを作成してアイテムを移動した場合、そのアイテムを手動で削除して(フォルダを空にする)、スクリプトを再度実行すると、そのディレクトリは削除されません。

誰もがこれを引き起こしているアイデアはありますか?私は、シェルスクリプトに関する話を知っていると主張していませんし、SOの空のディレクトリを調べるための構文もあります。

#!/bin/bash 

# Add support for other files and formats 
# Figure out how to move all rest of files to MISC without moving the script 
# Figure out why folders are deleted, unless they have an item stored at some point 
# Figure out how to copy files from existing folders out and make them empty 
# so they can be sorted, and they will be deleted in the end 

########################################## AUDIO ########################################## 

# Make folders for audio 
mkdir Audio 
mkdir Audio/AIFF 
mkdir Audio/FLAC 
mkdir Audio/MP3 
mkdir Audio/WAVE 

# Move all audio files to audio folder 
mv *.aiff Audio/AIFF 
mv *.flac Audio/FLAC 
mv *.mp3 Audio/MP3 
mv *.wav Audio/WAVE 

# Delete any empty folders related to audio folder - delete parent folder last 
# Because it will only ever be empty at the end of deleting all other subfolders 
if [ "$(ls Audio/AIFF 2> /dev/null)" == "" ]; 
then 
    rmdir Audio/AIFF 
fi 

if [ "$(ls Audio/FLAC 2> /dev/null)" == "" ]; 
then 
    rmdir Audio/FLAC 
fi 

if [ "$(ls Audio/MP3 2> /dev/null)" == "" ]; 
then 
    rmdir Audio/MP3 
fi 

if [ "$(ls Audio/WAVE 2> /dev/null)" == "" ]; 
then 
    rmdir Audio/WAVE 
fi 

if [ "$(ls Audio 2> /dev/null)" == "" ]; 
then 
    rmdir Audio 
fi 

########################################## DOCUMENTS ########################################## 

# Make folders for documents 
mkdir Documents 
mkdir Documents/DOC 
mkdir Documents/DOCX 
mkdir Documents/HTML 
mkdir Documents/RTF 
mkdir Documents/TXT 

# Move all docs to documents folder 
mv *.doc Documents/DOC 
mv *.docx Documents/DOCX 
mv *.html Documents/HTML 
mv *.rtf Documents/RTF 
mv *.txt Documents/TXT 

# Delete any empty folders related to documents folder - delete parent folder last 
# Because it will only ever be empty at the end of deleting all other subfolders 
if [ "$(ls Documents/DOC 2> /dev/null)" == "" ]; 
then 
    rmdir Documents/DOC 
fi 

if [ "$(ls Documents/DOCX 2> /dev/null)" == "" ]; 
then 
    rmdir Documents/DOCX 
fi 

if [ "$(ls Documents/HTML 2> /dev/null)" == "" ]; 
then 
    rmdir Documents/HTML 
fi 

if [ "$(ls Documents/RTF 2> /dev/null)" == "" ]; 
then 
    rmdir Documents/RTF 
fi 

if [ "$(ls Documents/TXT 2> /dev/null)" == "" ]; 
then 
    rmdir Documents/TXT 
fi 

if [ "$(ls Documents 2> /dev/null)" == "" ]; 
then 
    rmdir Documents 
fi 

########################################## IMAGES ########################################## 

# Make folders for images 
mkdir Images 
mkdir Images/GIF 
mkdir Images/JPEG 
mkdir Images/JPG 
mkdir Images/PNG 

# Move all Images to folder - Split up files into specific file extension folders? 
mv *.gif Images/GIF 
mv *.jpeg Images/JPEG 
mv *.jpg Images/JPG 
mv *.png Images/PNG 

# Delete any empty folders related to images folder - delete parent folder last 
# Because it will only ever be empty at the end of deleting all other subfolders 
if [ "$(ls Images/GIF 2> /dev/null)" == "" ]; 
then 
    rmdir Images/GIF 
fi 

if [ "$(ls Images/JPEG 2> /dev/null)" == "" ]; 
then 
    rmdir Images/JPEG 
fi 

if [ "$(ls Images/JPG 2> /dev/null)" == "" ]; 
then 
    rmdir Images/JPG 
fi 

if [ "$(ls Images/PNG 2> /dev/null)" == "" ]; 
then 
    rmdir Images/PNG 
fi 

if [ "$(ls Images 2> /dev/null)" == "" ]; 
then 
    rmdir Images 
fi 

########################################## VIDEOS ########################################## 

# Make folders for videos 
mkdir Videos 
mkdir Videos/AVI 
mkdir Videos/FLV 
mkdir Videos/MP4 
mkdir Videos/MPEG 
mkdir Videos/MOV 
mkdir Videos/WMV 

# Move all videos to folder - Split up files into specific file extension folders? 
mv *.avi Videos/AVI 
mv *.flv Videos/FLV 
mv *.mp4 Videos/MP4 
mv *.mpeg Videos/MPEG 
mv *.mov Videos/MOV 
mv *.wmv Videos/WMV 

# Delete any empty folders related to images folder - delete parent folder last 
# Because it will only ever be empty at the end of deleting all other subfolders 
if [ "$(ls Videos/AVI 2> /dev/null)" == "" ]; 
then 
    rmdir Videos/AVI 
fi 

if [ "$(ls Videos/FLV 2> /dev/null)" == "" ]; 
then 
    rmdir Videos/FLV 
fi 

if [ "$(ls Videos/MP4 2> /dev/null)" == "" ]; 
then 
    rmdir Videos/MP4 
fi 

if [ "$(ls Videos/MPEG 2> /dev/null)" == "" ]; 
then 
    rmdir Videos/MPEG 
fi 

if [ "$(ls Videos/MOV 2> /dev/null)" == "" ]; 
then 
    rmdir Videos/MOV 
fi 

if [ "$(ls Videos/WMV 2> /dev/null)" == "" ]; 
then 
    rmdir Videos/WMV 
fi 

if [ "$(ls Videos 2> /dev/null)" == "" ]; 
then 
    rmdir Videos 
fi 

########################################## ZIP ########################################## 

# Make folder for zip 
mkdir Zip 

# Move all zip files to folder 
mv *.zip Zip 

# Delete zip folder 
if [ "$(ls Zip 2> /dev/null)" == "" ]; 
then 
    rmdir Zip 
fi 

########################################## MISCELLANEOUS ########################################## 

# Make folder for Miscellaneous 
mkdir Miscellaneous 

# Delete Miscellaneous folder 
if [ "$(ls Miscellaneous 2> /dev/null)" == "" ]; 
then 
    rmdir Miscellaneous 
fi 

# Move rest of items to Miscellaneous Folder 
#mv *.* Miscellaneous 
+0

問題の再現例を挙げることはできますか? –

+0

これは、ディレクトリの空白をテストする正しい方法だと思いますか? '[$(ls Zip 2>/dev/null)" == ""]; '? – rkosegi

+0

スクリプト内でサポートされている項目を含むフォルダを作成します(.docファイルは問題ありません)。スクリプトを実行します。新しい場所に移動されたファイルを手動で検索します。消して。スクリプトを再実行してください。空のフォルダが削除されたかどうかを確認します。 –

答えて

3

あなたは離れて、それが空でないディレクトリを削除しないであろうような条件は、rmdirを保護して行うことができます。しかし、ゼロ以外の終了コードを返し、標準エラーへのメッセージを生成します。

あなたは何ができるか:

rmdir "$directory_that_may_be_empty_or_not" 2>/dev/null || : 

|| :は(あなたが処理するか、エラーを無視する方法に応じて重要ではないことや、場合があります)rmdirから任意のゼロ以外の戻りコードを「食べます」。

つまり、スクリプトがすべてのディレクトリを削除しようとし、空でない場合は失敗を無視します(アクセス権などの理由で削除が失敗した場合)。

これで問題が解決しない場合は、ディレクトリが空ではない可能性があります。それらには、-aオプションを追加しない限り、lsで表示されない隠しファイル(.ピリオドで始まる)が含まれている場合があります。しかし-aをコードに追加しないでください。.(現在のディレクトリ)と..(親ディレクトリ)の特殊ファイルが表示され、削除を試みないように指示されます。

追加の注記として、||は、2つのステートメントを「ORed」にする論理演算子です。 Bashは遅延評価を使用しているため、右のステートメントは左のステートメントが失敗した場合のみ実行されます(成功は戻りコード= 0、失敗=他のコード)。 :は、引数をとらないシェル組み込み関数であり、ゼロ復帰コード(trueコマンドのようなもの)を提供する以外は何もしません。この場合、構造全体のステータスが0になることが保証されます。

関連する問題