我希望有人可以帮助我,我正在寻找bash脚本的帮助,该脚本可以通过文件扩展名从多个目录移动文件,其中一个目录位于其各自目录的较深位置。
例如,我有一个“项目”目录,其中包含多个目录“项目001,项目002,项目003”,依此类推。我在那些文件夹中有“ .JPG”文件,并想将它们放在各自项目文件夹中的“ JPG”文件夹中-我怎么用bash脚本执行此操作,因为手工操作太多了?
为了使事情变得更复杂,其中一些项目文件夹中已经有“ JPG”文件夹,而其中一些文件中已经有一些文件作为重复项,因此我认为我需要向其中添加一个覆盖确认信息它也基于文件名。
我对bash有点了解,但是这有点麻烦,所以我们将不胜感激。
谢谢
/哈密
这是在Ubuntu服务器18.04 LTS上使用的CLI,该磁盘上有数千个带有人类文件名的目录-空格,括号和各种Unicode字符(例如日语和欧洲)。目录的名称是多种多样的,并且没有特定的公式。
理想情况下,我想从这里开始:
...对此:
答案 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
...