如何将文件从包含特定编号的目录移动到其他目录?

我想将所有文件从编号分别为1995、1996和1997的文件夹移到其他文件夹。

我在此列表中发现的大部分内容都与移动包含任何模式的任何文件有关。我希望命令在目录中查找,扫描.txt文件的内容,一旦他们找到1996,就将其放在1996目录中。

这意味着,如果命令在目录中查找,扫描.txt文件并在第一行中找到1996,在第十行中找到1995,则该文件不会同时放在1996和1995文件夹中。我希望它仅将文件放在1996文件夹中。

grep -rl --null --include '*.txt' 1996 . | xargs -0 sh -c 'cp "$@" /folderpath' sh

这似乎是将1995年的文件放到1996文件夹中,只是因为它在文件的某个位置包含1995年。

woaizhaokai2009 回答:如何将文件从包含特定编号的目录移动到其他目录?

我认为类似的方法可能有效:

find . -name '*.txt' -print0 |
xargs -0 -n1 sh -c '
    if a=$(head -n1 "$1" | grep -o "199[567]"); then
        mv "$1" "./$a"
    fi
' --

或者用xargs循环代替while IFS= read -r file; do。看起来像:

find . -name '*.txt' -print0 |
while IFS= read -r file; do
    if a=$(head -n1 "$file" | grep -o "199[567]"); then
        mv "$file" "./$a"
    fi
done
  • find找到了一切
    • .-在当前目录中
    • -name '*.txt'-名称以.txt
    • 结尾
    • -print0-并将它们打印为零终止列表
  • |-管道,将一个命令的输出传递给另一个命令
  • while-执行do ... done正文,直到命令返回非零退出状态
  • IFS= read -r file-读取零分隔列表的流行助记符,请参见bashfaq How can I read a file (data stream,variable) line-by-line (and/or field-by-field)?
    • head -n1 "$file"-从文件中提取第一行
    • grep
      • -o-仅输出匹配的字符串
      • 199[567]-匹配199519961997
      • grep如果匹配成功,则输出零退出状态(在if上很重要)
    • a=$(...)-将命令的输出分配给a。进程替换$(...)的退出状态是最后执行的命令,在这种情况下为grep
    • if command-仅在命令返回非零退出状态时执行then ... fi主体。就是仅当grep成功匹配字符串时,它才会返回零退出状态。
      • mv "$file" "./$a"-变量a(错误的命名方式...)包含与grep匹配的字符串,因此它将是19951996或` 1997年。因此,将文件移到正确的文件夹中。
本文链接:https://www.f2er.com/3121167.html

大家都在问