【问题标题】:Script to read file, find in the file system, and move to a directory脚本读取文件,在文件系统中查找,并移动到一个目录
【发布时间】:2016-08-04 04:08:32
【问题描述】:

我的脚本很糟糕,过去 2 天我一直在浏览网站,但没有找到解决方案,也无法拼凑起来。我不知所措,需要一些帮助。

我有一个包含部分名称和编号的文本文件,我需要在目录及其子目录中找到它并移至单独的目录。

我尝试了以下方法,但没有成功:

#!/bin/bash
getArray() {
   array=()
   while IFS= read -r line
   do
        array+=("$line")
   done < "$1"
}

getArray "dan.txt"
for e in "${array[@]}"
do
        mv "$e" /root/moved
done

提前致谢。

【问题讨论】:

  • 部分名称是什么意思?
  • 告诉我们文件名及其完整路径
  • 更正,文本文件包含文件名列表,没有扩展名。文本文件的位置在/input/files.txt,数据的位置在/data/Match目录及其子目录中。
  • 你能显示(几行)dan.txt吗?没有路径的文件名?

标签: arrays bash


【解决方案1】:

如果通过部分文件名,您的意思是它们在每个文件名中都有匹配的内容,您可以这样做:

find . -name "foo*"

如果它还依赖于目录(即路径中的任何父文件夹),请改用 -regex 选项标志,它将匹配整个文件路径,而不是文件名:

find . -regex '.*/foo/[^/]*.doc'

所以:

while read -r line; do
    find . -name "$line"
done < "$1"

EDIT 每个 cmets:

while read -r line; do
    find "/data/Match" -type f -iname "$line\.*" -exec mv -t /root/moved {} \;
done < "$1"

您可能需要将 -iname 参数更改为以下内容:

  • 如果它们是完整的文件名(例如,值为“filename.txt”的行与名为“filename.txt”的文件匹配),则为-iname "$line"
  • 如果它们是部分文件名(例如,值为“file”的行匹配“file.txt”和“filename.txt”),则为-iname "$line*"
  • 如果它们是没有文件扩展名的完整名称(例如,值“file”的行匹配“file.txt”,但不匹配“filename.txt”),则-iname "$line\.*"

顺便说一下find 命令的一点解释:

  • -type f - 仅文件(d 用于目录,l 用于软/硬链接);
  • -iname - 类似于 -name,但不区分大小写;
  • -exec - 为每个匹配文件执行的命令,以 \; 结尾
  • mv -t /root/moved {} - -t 选项是目标目录,后跟将文件移动到的目标路径。源文件参数(即我们要移动的文件路径)是mv中的最后一个参数,即{},表示find -exec命令中的当前文件路径。

请注意,您可能需要使用"$line*",因为我无法从文本文件中看出您的名字有多模糊。如果它们肯定会从头开始匹配(例如,文件中值为“somefile”的行匹配以“somefile.*”格式命名的文件,其中 * 是任意数量的字符)

【讨论】:

  • 谢谢尼克。我在上面添加了一个更正。要移动的文件是唯一的,有近 34k 个条目。
  • @baghdaddy4 检查更新 - 我想这会解决你的问题。
  • 尼克。感谢更新并为命名方案的模糊性道歉。除了它们都是唯一的文件名之外,我不能透露更多。我将已编辑的部分输入脚本并收到以下错误:./input.txt: line 4:: No such file or directory 它在“done
  • 我会稍微更新问题以帮助您选择正确的命令。顺便说一句,你试过了吗?
  • @baghdaddy4 哇!为您提供最终更新 - 这绝对可以解决您的问题。让我知道这是否有效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多