移动文件并重命名 - 一行

时间:2013-06-04 16:33:42

标签: linux bash

我在某些服务器上遇到了许多具有相同内容和相同名称的文件。我需要隔离这些文件进行分析,所以我不能删除重复项。操作系统是Linux(centos和ubuntu)。

我枚举文件名和位置,并将它们放入文本文件中。

然后我执行for语句将文件移动到隔离区。

for file in $(cat bad-stuff.txt); do mv $file /quarantine ;done

问题是它们具有相同的文件名,我只需要添加文件名的唯一内容以使其正确保存。我确信它很简单,但我对正则表达式并不擅长。谢谢你的帮助。

3 个答案:

答案 0 :(得分:4)

由于您使用的是Linux,因此您可以利用GNU mv的--backup

while read -r file
do 
    mv --backup=numbered "$file" "/quarantine"
done < "bad-stuff.txt"

以下是一个展示其工作原理的示例:

$ cat bad-stuff.txt 
./c/foo
./d/foo
./a/foo
./b/foo
$ while read -r file; do mv --backup=numbered "$file" "./quarantine"; done < "bad-stuff.txt"
$ ls quarantine/
foo  foo.~1~  foo.~2~  foo.~3~
$

答案 1 :(得分:1)

我会用这个

for file in $(cat bad-stuff.txt); do mv $file /quarantine/$file.`date -u +%s%N`; done

你将获得附加时间戳的每个文件(以纳秒为单位)。

答案 2 :(得分:1)

您可以创建由directoryfilename组成的新文件名。因此,您可以在原始代码中再添加一个参数:

for ...; do mv $file /quarantine/$(echo $file | sed 's:/:_:g') ; done

请注意,您应该使用足够特殊的正确字符替换_