【问题标题】:Bash SH Script - Rename File with specific extension + Move to specific locationBash SH 脚本 - 使用特定扩展名重命名文件 + 移动到特定位置
【发布时间】: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


【解决方案1】:

我可能在那个解释中遗漏了一些要点。但这会如你所愿吗?

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

【讨论】:

  • 谢谢我现在测试一下。哪一点不清楚?我可以试着解释得更好。
  • 不清楚的是,您发布的脚本包含对文本中未提及的事物的引用。例如test 和part。 PS:我稍微改变了答案中的 glob 模式,只匹配 DOCTEMP 或 DOCFINAL 子文件夹中的文件。
  • "test" 只是“NameOfTheDocument”的示例词。 “部分”是因为有时这些 PDF 被压缩(多个 .part)。编辑:如果我想使用完全不同的词而不是 DOCTEMP 和 DOCFINAL,例如 OFFICE 和 IWORK?
  • 用更好的视觉解释更新了原始帖子
  • 你可以使用 glob 模式 {OFFICE,IWORK} 而不是 {DOCTEMP,DOCFINAL}
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-20
  • 2020-01-10
  • 2015-01-06
  • 2019-06-26
  • 2020-04-05
相关资源
最近更新 更多