如何在 bash 中循环

如何在 bash 中循环

我有一个包含如下文件的目录:

PropertyNameRevCount.pdf
PropertyNameRevWordcloud.pdf
PropertyNameRevComments.pdf

我正在尝试将它们移动到当前目录的子目录中,名称为:

PropertyName

我已经创建了目录,并且有数百个文件需要移动。我正在寻找一个 bash 脚本来帮助自动化该过程。到目前为止,我有这个:

For f in *.pdf

我只是不知道如何仅让文件名的第一部分作为移动的条件。

答案1

这是一个简单的循环:

for FILE in PropertyName*.pdf
do
    mv $FILE PropertyName
done

一个更复杂的例子,假设我有一个有效的 PropertyNames 列表和一个有效的“SecondParts”列表

for FILE in {PropertyName1,PropertyName2,PropertyName3}*.pdf
do if [ -e $FILE ]
then
    DIR=`echo $FILE|sed -E -e 's/(Rev|TALi).pdf$//'`
    mv $FILE $DIR
fi
done

答案2

您可以使用cut分隔符(例如下划线)来拆分字符串

fname="applebox_businesstruck.pdf"
firstpart=$(cut -d_ -f1 <<< "$fname")
echo $firstpart
applebox

答案3

以下是我对您的问题的理解以及解决方案

您当前的目录树如下

|-- AnotherProp
|-- AnotherProptell.pdf
|-- AnotherProptest.pdf
|-- AnotherProptouch.pdf
|-- PropName
|-- PropNametell.pdf
|-- PropNametest.pdf
`-- PropNametouch.pdf

您想根据文件名的第一部分将 pdf 文件移动到适当的子目录吗?

BASH 脚本如下(移动我的文件) -

    #!/bin/bash
    
    #Read all the subdirectory names in your current directory
    subdirs=( $(find . -mindepth 1 -maxdepth 1 -type d -printf "%P\n" ))
    
    # Loop1 - Read all the files
    for file in *.pdf
    do
        #Loop2 - Match filename with subdirectory
        for mydir in ${subdirs[@]}
        do
            [[ ${file} =~ ^$mydir.* ]] && echo "move $file to $mydir"
        done
    done

示例输出为 -

move AnotherProptell.pdf to AnotherProp
move AnotherProptest.pdf to AnotherProp
move AnotherProptouch.pdf to AnotherProp
move PropNametell.pdf to PropName
move PropNametest.pdf to PropName
move PropNametouch.pdf to PropName

在Loop2中,可以根据您的需要用函数或mv命令替换echo语句。

希望这可以帮助。

相关内容