根据与文件的比较移动文件

时间:2017-10-24 18:04:18

标签: bash shell

我有1000个文件,名称如下:

东西-345-something.txt
something-的 5468 -something.txt
一些-100-something.txt
something-的 6200 -something.txt
还有更多...

我有一个txt文件,其中只有数字。 f.e:

1000
500个
5468
6200

699个
USW ...

现在我想移动所有文件,这些文件的文件名都在我的txt文件中。

因此,在上面的示例中,只应移动以下文件: something-的 5468 -something.txt something-的 6200 -something.txt

有没有简单的方法来实现这一目标?

4 个答案:

答案 0 :(得分:1)

通过这样做动态移动文件怎么样:

for i in `cat you-file.txt`; do
    find . -iname "*-$i-*" -exec mv '{}' /target/dir \;
; done

对于文本文件中的每一行,find命令将尝试查找仅匹配模式*-$i-*(某事物 - 6200 -something.txt)并移动它是你的目标目录。

答案 1 :(得分:0)

天真的实施:for file in $(ls); do grep $(echo -n $file | sed -nr 's/[^-]*-([0-9]+).*/\1/p') my-one-txt.txt && mv $file /tmp/somewhere; done

英文:对于ls输出中的每个文件:在文本文件中解析带有sed的文件名的部分文件名和grep。如果找不到任何内容,grep会返回非零退出代码,因此在这种情况下会mv进行评估。

答案 2 :(得分:0)

名为move的脚本文件(可执行文件):

#!/bin/bash
TARGETDIR="$1"
FILES=`find . -type f` # build list of files
while read n # read numbers from standard input
do # n contains a number => filter list of files by that number:
  echo "$FILES" | grep "\-$n-" | while read f
  do # move file that passed the filter because its name matches n:
    mv "$f" "$TARGETDIR"
  done
done

像这样使用:

cd directory-with-files
./move target-directory < number-list.txt

答案 3 :(得分:0)

这是一个疯狂的bash hackery

shopt -s extglob nullglob
mv -t /target/dir *-@($(paste -sd "|" numbers.txt))-*

使用paste使用竖线字符连接数字文件中的所有行,然后使用bash extended pattern matching查找与任何一个数字匹配的文件。

我假设mv选项来自GNU coreutils的-t