Bash 根据文件名的某些部分将文件移动到目录?

Bash 根据文件名的某些部分将文件移动到目录?,bash,filenames,move,Bash,Filenames,Move,我有几千本电子书,名字像AuthorFirstName AuthorLastName Title XX.pdf,其中XX是1-99中的数字(卷号) Author Tilt名称可以是多个单词,因此这里我想将文件复制到名为AuthorFirstName AuthorLastName title的文件夹中。除了数字以外的所有内容都应该是文件夹名,这样电子书的所有卷都可以放在同一个文件夹中 比如说 root.....>AuthorFirstName AuthorLastName Title>

我有几千本电子书,名字像
AuthorFirstName AuthorLastName Title XX.pdf
,其中
XX
1-99
中的数字(卷号)

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

比如说

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

对于任务,您可以混合使用
find
sed
bash
脚本。不过,你必须自己写,如果失败了,还得寻求帮助

您还可以尝试一些用于批量移动/重命名的现成工具,如下所示: 但从未使用过这些工具。

我会尝试使用以下工具:

for folder in $(ls | sed -r "s/(.*) ([0-9]{1,2})/\1/" | uniq)
do 
    mkdir $folder
    mv $(find . -name "$folder*") $folder
done    
我不知道这是否正确,但它可能会给你一些提示


编辑:将uniq添加到管道。

使用循环,如下所示:

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