Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash Shell脚本不是';t在某些情况下删除空目录_Bash_Shell_Unix - Fatal编程技术网

Bash Shell脚本不是';t在某些情况下删除空目录

Bash Shell脚本不是';t在某些情况下删除空目录,bash,shell,unix,Bash,Shell,Unix,我正在编写一个shell脚本来组织文件。到目前为止,它还不支持很多类型,只是足以测试它。工作流程如下: 为一类项目创建文件夹 使用通配符移动所有项目 删除所有空文件夹 对其他类型的文件重复此操作 到目前为止,如果目录中没有存储任何内容,则目录删除部件可以工作。因此,如果我运行脚本,但没有任何内容被移动到文件夹中,那么在第一次运行时它将被删除。但是,如果创建文件夹并将项目移动到其中,如果手动删除这些项目(使文件夹为空)并再次运行脚本,则不会删除目录 有人知道这是什么原因吗?我并不声称对shell脚

我正在编写一个shell脚本来组织文件。到目前为止,它还不支持很多类型,只是足以测试它。工作流程如下:

  • 为一类项目创建文件夹
  • 使用通配符移动所有项目
  • 删除所有空文件夹

    对其他类型的文件重复此操作

  • 到目前为止,如果目录中没有存储任何内容,则目录删除部件可以工作。因此,如果我运行脚本,但没有任何内容被移动到文件夹中,那么在第一次运行时它将被删除。但是,如果创建文件夹并将项目移动到其中,如果手动删除这些项目(使文件夹为空)并再次运行脚本,则不会删除目录

    有人知道这是什么原因吗?我并不声称对shell脚本了解很多,甚至还知道检查空目录的语法

    #!/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
    

    您可以取消保护
    rmdir
    的条件,因为它不会删除非空目录。然而,它将返回一个非零的退出代码,并生成一条标准错误消息

    你能做的是:

    rmdir "$directory_that_may_be_empty_or_not" 2>/dev/null || :
    
    | |:
    会“吃掉”来自
    rmdir
    的任何非零返回代码(这可能重要,也可能不重要,取决于您如何处理或忽略错误)

    换句话说,让您的脚本尝试删除所有目录,如果它们不是空的,则忽略失败(或者,如果由于任何其他原因(例如访问权限)导致删除失败)

    如果这不能解决您的问题,那么您的目录可能不是空的。它们可能包含隐藏文件(以
    句点开始),除非添加
    -a
    选项,否则
    ls
    不会列出这些文件。但不要在代码中添加
    -a
    ,因为它还指示
    ls
    列出
    (当前目录)和
    (父目录)特殊文件,并将导致当前代码从不尝试删除


    另请注意,
    |
    是一个逻辑运算符,允许对两条语句进行“或”。Bash使用延迟求值,因此只有当左边的语句失败时才执行右边的语句(成功意味着返回代码=0,失败=任何其他代码)
    是一个内置的shell,它不接受任何参数,除了提供零返回代码(如
    true
    命令)外,什么也不做。在这种情况下,它保证整个构造的状态为0。

    您能给出一个如何重现该问题的示例吗?您认为这是测试目录空性的正确方法吗:
    如果[“$(ls Zip 2>/dev/null)”==”?创建一个包含脚本支持的项目的文件夹(可以使用.doc文件)。运行脚本。手动查找已移动到新位置的文件。删除它。再次运行脚本。检查是否已删除空文件夹。
    mkdir-p Audio/{AIFF,FLAC,MP3,WAVE}| |退出1
    将在一次操作中创建所有文件夹,如果出现任何故障,则退出。(如果某些文件夹已存在且没有错误,也可以运行该程序)。你的
    =
    应该是
    =
    。使用
    [-z“$(ls-A“$dirname”)”]
    测试空目录。@rkosegi“我声称对shell脚本一无所知,甚至还掌握了检查空目录的语法。”