繁体   English   中英

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

[英]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变量的文件(因此它将查找文件名FebMar等中带有单词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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM