【问题标题】:Move files to directories based on some part of file name?根据文件名的某些部分将文件移动到目录?
【发布时间】:2013-04-03 08:51:12
【问题描述】:

我有几千本名为 AuthorFirstName AuthorLastName Title XX.pdf 的电子书,其中 xx 的编号来自 1-99(卷号)。

作者姓名可以是多个单词,所以在这里我想将文件复制到名称为AuthorFirstName AuthorLastName title 的文件夹中。除了数字之外的所有内容都应该是文件夹名称,以便电子书的所有卷都在同一个文件夹中。

例如

root.....>AuthorFirstName AuthorLastName Title>AuthorFirstName AuthorLastName Title XX.pdf

【问题讨论】:

    标签: bash filenames move


    【解决方案1】:

    您可以在任务中混合使用findsedbash 脚本。你必须自己写它,如果你失败了,请寻求帮助。

    您还可以尝试一些现成的工具来进行大规模移动/重命名,例如:http://tldp.org/LDP/GNU-Linux-Tools-Summary/html/mass-rename.html 但从未使用过其中之一。

    【讨论】:

      【解决方案2】:

      我会试试这个:

      for folder in $(ls | sed -r "s/(.*) ([0-9]{1,2})/\1/" | uniq)
      do 
          mkdir $folder
          mv $(find . -name "$folder*") $folder
      done    
      

      我不知道这是否正确,但它可能会给你一些提示。

      编辑:将 uniq 添加到管道中。

      【讨论】:

        【解决方案3】:

        使用如下所示的循环:

        find . -type f -name "*pdf" -print0 | while IFS= read -d '' file
        do
            # extract the name of the directory to create
            dirName="${file% *}"
        
            # create the directory if it doesn't exist
            [[ ! -d "$dirName" ]] && mkdir "$dirName"
        
            mv "$file" "$dirName"
        done
        

        【讨论】: