【问题标题】:How do you move files of specific file extension in multiple directories, one directory deeper within their respective directories?您如何在多个目录中移动特定文件扩展名的文件,一个目录在各自目录中更深?
【发布时间】:2019-09-04 09:08:04
【问题描述】:

我希望有人可以帮助我,我正在寻求一个 bash 脚本的帮助,以通过文件扩展名从多个目录移动文件,一个目录在各自目录中更深的一个目录。

例如,我有一个“项目”目录,其中包含多个目录“项目 001、项目 002、项目 003”等等。我在这些文件夹中有“.JPG”文件,并希望将它们放在各自项目文件夹中的“JPG”文件夹中 - 我该如何使用 bash 脚本来执行此操作,因为手动操作太多了?

为了使事情变得更复杂,其中一些项目文件夹中已经有“JPG”文件夹,其中一些文件夹中已经有一些文件作为重复文件,所以我想我需要添加一个覆盖确认它也基于文件名。

我知道一点 bash,但这有点过头了,所以任何帮助都将不胜感激。

谢谢,

/哈密

这是在 Ubuntu Server 18.04 LTS 上使用 CLI,磁盘上包含数千个目录,其中包含人类文件名 - 空格、括号和各种 unicode 字符,例如日语和欧洲字符。目录名称多种多样,没有特定的公式。

理想情况下,我想从这里开始:

  • 项目
    • 项目001
      • 图片001.jpg
    • 项目002
      • 图片002.jpg
      • 图片003.jpg
    • 项目 003

...到这个:

  • 项目
    • 项目001
      • JPG
        • 图片001.jpg
    • 项目002
      • JPG
        • 图片002.jpg
        • 图片003.jpg
    • 项目 003

【问题讨论】:

    标签: bash command-line-interface sh


    【解决方案1】:

    您可以使用find 来搜索所有*.jpg 文件和一个简单的helper 脚本,该脚本由-exec 选项调用到find 来创建jpg目录并将所有.jpg 文件移动到新目录中。

    帮助脚本将简单地利用readlink -f 获取绝对文件名,然后使用快速参数扩展 从绝对文件名中修剪最后一个/... 组件以获得完整路径。然后只需在路径末尾创建jpg 目录并将文件移动到新目录即可。

    您的帮助脚本(我称之为helper.sh)可能是:

    #!/bin/sh
    
    test -z "$1" && exit                        ## validate 1 argument given or exit
    
    full=$(readlink -f "$1")                    ## get full filename
    dir="${full%/*}"                            ## get full path
    
    test "${full##*.}" = 'jpg' || exit          ## test extension is jpg or exit
    
    test -z "$dir" && dir="/"                   ## check if file was in / (root) 
    
    test -d "$dir/jpg" || mkdir -p "$dir/jpg"   ## check/create jpg dir at end of path
    
    mv "$full" "$dir/jpg"                       ## move file into new jpg dir
    

    注意:在创建帮助脚本后,请确保使用chmod +x helper.sh 使其可执行

    原始项目目录树

    $ tree Projects/
    Projects/
    ├── Project_001
    │   └── Image_001.jpg
    ├── Project_002
    │   ├── Image_002.jpg
    │   └── Image_003.jpg
    └── Project_003
    

    您在Projects 目录上运行的find 命令会为每个文件调用帮助程序脚本:

    $ find Projects/ -type f -name "*jpg" -exec ./helper.sh '{}' \;
    

    结果项目目录树

    $ tree Projects/
    Projects/
    ├── Project_001
    │   └── jpg
    │       └── Image_001.jpg
    ├── Project_002
    │   └── jpg
    │       ├── Image_002.jpg
    │       └── Image_003.jpg
    └── Project_003
    

    如果您还有其他问题,请告诉我。

    保存已存在于 jpg 目录中的文件

    根据您的附加评论,为了在您的项目下的 jpg 目录中保留 .jpg 文件,您需要做的就是添加一项额外的检查。如果路径的最后一个组件已经是jpg,则退出助手,例如

    test "${dir##*/}" = 'jpg' && exit           ## if already in jpg dir, exit
    

    helper.sh的上下文中显示:

    test -z "$1" && exit                        ## validate 1 argument given or exit
    
    full=$(readlink -f "$1")                    ## get full filename
    dir="${full%/*}"                            ## get full path (trim last /*)
    
    test "${dir##*/}" = 'jpg' && exit           ## if already in jpg dir, exit
    test "${full##*.}" = 'jpg' || exit          ## test extension is jpg or exit
    ...
    

    原始项目目录树(带现有 jpg)

    $ tree Projects/
    Projects/
    ├── Project_001
    │   ├── Image_001.jpg
    │   └── jpg
    │       └── Image_000.jpg
    ├── Project_002
    │   ├── Image_002.jpg
    │   ├── Image_003.jpg
    │   └── jpg
    │       ├── Image_000.jpg
    │       └── Image_001.jpg
    └── Project_003
    

    结果项目目录树

    $ tree Projects/
    Projects/
    ├── Project_001
    │   └── jpg
    │       ├── Image_000.jpg
    │       └── Image_001.jpg
    ├── Project_002
    │   └── jpg
    │       ├── Image_000.jpg
    │       ├── Image_001.jpg
    │       ├── Image_002.jpg
    │       └── Image_003.jpg
    └── Project_003
    

    【讨论】:

    • 嘿大卫,感谢您如此快速的回复,这太棒了。我在测试台目录结构中运行脚本,它几乎可以完美运行。我似乎遇到的问题是,如果“jpg”文件夹已经在“Project 00X”文件夹中,它会在其中创建另一个文件夹并将所有内容移到那里,例如'项目/项目 00X/jpg/jpg/Image 002.jpg' 谢谢,
    • 哦,有趣的是,没有防止这种情况发生——不用担心,给我几分钟时间。
    • 如果它解决了您的问题,您可以多花一点时间看看是否有其他答案,然后请查看:What should I do when someone answers my question?。选择任何一个答案,无论我的与否,都可以回答您的问题并提供最佳解决方案。 (这可以防止没有选择答案的问题永远漂浮)
    • 很棒的大卫,效果很好。感谢您如此迅速地回答问题并分享您的知识。最好的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    • 2015-02-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多