【发布时间】:2016-05-22 04:53:54
【问题描述】:
查看视觉解释和编辑
我正在尝试创建一个 bash 脚本来进行重命名+移动。
这是示例情况:
|DOCTEMP - NameOfTheFolder---------|NameOfADocument.docx
FOLDER---|
|DOCFINAL - OtherNameOfTheFolder---|OtherNameOfADocument.pdf
|
|etc.
我想做的是一个脚本:
第一部分
仅当文件有 docx, pdf, ppt 时,才将其重命名为其文件夹,但没有 DOCTEMP - / DOCFINAL -。
NameOfADocument.docx => NameOfTheFolder.docx
OtherNameOfADocument.pdf => OtherNameOfTheFolder.pdf
第二部分
重命名后,根据旧文件夹名称的第一部分将该文件移动到另一个文件夹。
NameOfTheFolder.docx => if **DOCTEMP** then => /ROOT/DOCTEMP/NameOfTheFolder.docx
OtherNameOfTheFolder.docx => if **DOCFINAL** then => /ROOT/DOCFINAL/OtherNameOfTheFolder.pdf
我尝试使用类似的东西,但它不起作用
#!/bin/bash
cd "$ROOT/FOLDER"
# for filename in *; do
find . -type f | while IFS= read filename; do # Look for files in all ~/FOLDER sub-dirs
case "${filename,,*}" in # this syntax emits the value in lowercase: ${var,,*} (bash version 4)
*.part) : ;; # Excludes *.part files from being moved
move.sh) : ;;
*test*) mv "$filename" "$ROOT/DOCTEMP/" ;; # Using move there is no need to {&& rm "$filename"}
*) echo "Don't know where to put $filename" ;;
esac
done
编辑:视觉解释
给定
ROOT/DOWNLOADS/OFFICE - House/file.docx
/IWORK - Car/otherfile.docx
然后是第一部分
ROOT/DOWNLOADS/OFFICE - House/House.docx
/IWORK - Car/Car.docx
然后是第二部分
ROOT/DOCUMENTS/OFFICE/House.docx
/IWORK/Car.docx
docx 可以是 pdf 或 ppt;这里只是一个例子
EDIT2:最终脚本
#!/bin/bash
shopt -s nullglob
for filename in /ROOT/DOWNLOADS/{OFFICE,IWORK}/*/*.{docx,pdf,ppt}; do
new_path="$(dirname $filename).${filename##*.}"
new_path="${new_path/DOWNLOADS/DOCUMENTS}"
echo "moving $filename -> $new_path"
mv "$filename" "$new_path"
done
【问题讨论】:
-
问题解决后,您无需编辑问题的标题,只需接受正确答案即可;)
-
不要在此处将“SOLVED”编辑为标题,或将答案编辑为问题。点击复选框接受答案标记它已解决,并让读者清楚您正在使用哪个答案。
-
...如果您使用的内容与提供的第 3 方答案不同,请自行添加作为答案,不要将其编辑到问题中。
-
(另外,这样标记您的编辑是不受欢迎的——一个问题应该被解读为一个单一的、有凝聚力的叙述,而不是修改的历史;想要查看历史的人可以要求 StackOverflow 显示它们是历史发布版本之间的差异)。
标签: bash file directory sh move