[英]filter files with find command, sort output into directories
#!/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
,通过首先检查是否存在具有该名称的目录来遍历每个迭代,如果不存在,则创建具有名称的目录(因此,当month=Jan
,如果Jan
目录不存在,它将创建一个Jan
目录。如果确实存在,请进行下一行操作,等等)。
2)在当前目录中查找名称中具有month变量的文件(因此它将查找文件名Feb
, Mar
等中带有单词Jan
所有文件)。
3)通过将输出移至具有相同月份变量名称的目录来传递输出(因此,所有Jan
文件都移至Jan
目录, Feb
文件移至Feb
目录,依此类推)。
我一直在尝试编码最后一个find
命令行已经有一段时间了,我检查了大多数相关问题,但是我得到的最多是一个错误,说我无法将fileThatHasMonthInTheName.pdf
移动到其自己的子目录sameLongFilename
或者试图将月份文件夹移到其自身。
我的目标是:查找文件名中具有月份名称的文件,将其通过管道传递给具有相同月份名称的目录
由@thanasisp产生输出的命令
find . -maxdepth 1 -type f -name "*$month*" | xargs -I{} mv {} $month
您可以进行这些修改
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
以便不会返回以前复制到现有月份目录的文件
与-I
一起使用xargs
以便在正确的位置处理查找输出,保留带空格的任何参数,例如,名为Jan 01.csv
的文件
正如另一个答案所解释的,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想要的那样。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.