我有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
有没有简单的方法来实现这一目标?
答案 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
。