【问题标题】:Linux help: how do you move files to folders based on a .txt file?Linux 帮助:如何将文件移动到基​​于 .txt 文件的文件夹中?
【发布时间】:2021-04-20 10:29:20
【问题描述】:

我有一个 .txt 文件,其中包含一列 ID 及其年龄(作为整数)。我已经在我的目录中为每个年龄类别(从 20 到 86 岁)创建了单独的文件夹。对于我的 .txt 文件中的每个 ID,我想根据我的 .txt 文件第二列中列出的年龄类别将他们的图像(当前存储在文件夹“data”中)移动到适当的文件夹。

非常感谢任何有关如何在 Linux 中执行此操作的帮助!

更新了文件以不同后缀结尾的示例。

当前工作目录:

data/ 20/ 21/ 22/ 23/ 24/ ...

文本文件:

ID001 21
ID002 23
ID003 20
ID004 22
ID005 21

ls data/

ID001-XXX-2125.jpg
ID002-YYY-2370.jpg
ID003-XXX-2125.jpg
ID004-YYY-2370.jpg
ID005-XXX-2125.jpg

期望的输出:

20/
ID003-XXX-2125.jpg

21/
ID001-XXX-2125.jpg
ID005-XXX-2370.jpg

22/
ID004-YYY-2370.jpg

23/
ID002-YYY-2370.jpg

【问题讨论】:

  • edit您的问题添加预期的输出并展示您自己解决问题的尝试,以便我们为您提供帮助。见How to Ask

标签: linux awk directory mv


【解决方案1】:
while read fil id
do
    mv -f "data/"*"$fil"*".jpg" "$id/"
done < file

循环读取文件(在本例中称为文件)中的两个字段,并使用变量来构造和执行 mv 命令。

【讨论】:

  • read 上省略默认-r 将损坏包含反斜杠的输入。
【解决方案2】:

正如你所建议的,awk 可以完成这种任务(尽管请参阅下面的 Ed Morton 的评论)。您可以尝试以下使用 GNU awk 进行测试的方法。从您的工作目录中,您可以执行以下操作:

awk '{system("mv data/"$1"*.jpg " $2)}' inputfile

解释:这里使用了system()函数。 system() 函数允许您执行作为表达式提供的命令。在这种情况下:

  1. 我们使用mv(移动)命令并使用输入文件中的第一个字段$1来寻址数据目录中的JPG文件。
  2. 然后我们使用目标目录的输入文件的第二个字段$2

system() 函数仿照标准 C 库函数建模。进一步阅读The GNU Awk User’s Guide

【讨论】:

  • 谢谢托马斯!如果我的每个文件的后缀都略有不同怎么办?例如“-2125.jpg”、“-2124.jpg” 我可以执行以下操作吗? awk '{system("mv data/"$1"*.jpg " $2)}' inputfile
  • awk 是一个操作文本的工具。 shell 是一种工具,用于操作文件和进程以及对工具的顺序调用。您正在尝试使用 awk 就好像它是一个 shell 一样,因此在每个输入行生成一个子 shell,执行 shell { awk { system { shell { mv } } } } 而不仅仅是 shell { mv } 并将未引用的输入数据公开给 shell 以使用相关的安全性进行解释基于输入值、环境设置、运行脚本的目录的内容等问题和潜在的故障。简而言之 - 不,awk 不适合这种任务。
【解决方案3】:

考虑让您的.txt 文件位于您当前的工作目录中。你可以试试这个编写和测试过的脚本吗?

#!/bin/sh    
DIR_CWD="/path/to/current_working_directory"
cd "$DIR_CWD/data"
    for x in *; do
        ID_number=`echo $x | awk -F"-" '{print $1}'`
        DIR_age=`cat "$DIR_CWD/file.txt" | grep $ID_number | awk '{print $2}'`
        mv -- "$DIR_CWD/data/$x" "$DIR_CWD/$DIR_age"
    done

请注意,DIR_CWD 必须声明为您当前工作目录的路径。

【讨论】:

猜你喜欢
  • 2021-10-19
  • 2023-03-17
  • 2010-11-17
  • 1970-01-01
  • 2013-06-27
  • 2011-05-05
  • 1970-01-01
  • 2013-12-08
  • 2015-07-30
相关资源
最近更新 更多