#!/bin/env bash
MONTHS=(Jan Feb Mar ...)
for month in ${MONTHS[@]}
do
if [ ! -d $month ]; then
mkdir $month
fi
# below is the code I would like to improve upon
find ./ -iname "*$month*.pdf" -type f | xargs mv $month/
done
我想做的是:
1)使用变量MONTHS
,首先检查是否存在具有此名称的目录,并且如果不存在,则创建一个具有该名称的目录(所以当{{ 1}},如果month=Jan
目录不存在,它将成为Jan
目录。如果它存在,则继续下一行等。)
2)查找当前目录中名称中包含月份变量的文件(因此它会查找文件名中Jan
,Jan
中包含Feb
字样的所有文件等等。)
3)通过将输出移动到具有相同月份变量名称的目录来管道输出(因此所有Mar
文件都移动到Jan
目录,Jan
文件移动到{{ 1}}目录等。)
我一直在尝试编写最后Feb
命令行的代码很长一段时间,我检查了大部分相关的问题,但是我得到的最多的是一个错误,说我无法移动Feb
已放入其自己的子目录find
,或者它正在尝试将月份文件夹移动到自身。
我的目标是:找到文件名中包含月份名称的文件,将其管道到具有相同月份名称的目录
由@thanasisp生成输出的命令
fileThatHasMonthInTheName.pdf
答案 0 :(得分:0)
你可以进行这些修改
finally
end
将创建目录(如果不存在)
MONTHS=( Jan Feb Mar )
for month in ${MONTHS[@]}
do
mkdir -p $month
find . -maxdepth 1 -type f -name "*$month*" | xargs -I{} mv {} $month
done
个文件应限制为mkdir -p
,以便不会返回先前复制到现有月份目录的文件
将find
与maxdepth 1
一起使用,以便在正确的位置处理查找输出,保留带空格的任何参数,例如名为xargs
的文件
答案 1 :(得分:0)
正如另一个答案所解释的那样,find会进入子目录。我的解决方案只是使用ls,它不会(它只显示当前目录中的文件):
#!/bin/bash
MONTHS=(Jan Feb Mar ...)
for month in ${MONTHS[@]}
do
if [ ! -d $month ]; then
mkdir $month
fi
/bin/ls *$month*.pdf | xargs mv -t $month
done
我使用/ bin / ls确保我没有将某些用户喜欢的别名格式带入脚本。
注意:我编辑了ls命令以包含缺少的*。现在/bin/ls *$month*.pdf
就像OP想要的那样。