如何将特定文件扩展名的文件移动到多个目录中,一个目录在其各自目录中更深?

时间:2019-04-14 01:42:13

标签: bash command-line-interface sh

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

例如,我有一个“项目”目录,其中包含多个目录“项目001,项目002,项目003”,依此类推。我在那些文件夹中有“ .JPG”文件,并想将它们放在各自项目文件夹中的“ JPG”文件夹中-我怎么用bash脚本执行此操作,因为手工操作太多了?

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

我对bash有点了解,但是这有点麻烦,所以我们将不胜感激。

谢谢

/哈密

这是在Ubuntu服务器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

1 个答案:

答案 0 :(得分:0)

您可以使用find进行所需的工作,即搜索所有*.jpg文件,并使用一个简单的 helper 脚本,该脚本由{{1} }},以创建-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 命令为每个文件调用帮助程序脚本,将是:

find

结果项目目录树

Projects

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

已将文件保存在jpg目录中

为您的附加注释,为了保留项目下$ 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中的上下文中:

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

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

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
...