使用find命令过滤文件,将输出排序到目录中

时间:2017-11-08 00:41:57

标签: bash

#!/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)查找当前目录中名称中包含月份变量的文件(因此它会查找文件名中JanJan中包含Feb字样的所有文件等等。)

3)通过将输出移动到具有相同月份变量名称的目录来管道输出(因此所有Mar文件都移动到Jan目录,Jan文件移动到{{ 1}}目录等。)

我一直在尝试编写最后Feb命令行的代码很长一段时间,我检查了大部分相关的问题,但是我得到的最多的是一个错误,说我无法移动Feb已放入其自己的子目录find,或者它正在尝试将月份文件夹移动到自身。

我的目标是:找到文件名中包含月份名称的文件,将其管道到具有相同月份名称的目录

由@thanasisp生成输出的命令

fileThatHasMonthInTheName.pdf

2 个答案:

答案 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,以便不会返回先前复制到现有月份目录的文件

  • findmaxdepth 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想要的那样。