将文件夹中的所有文件复制到另一个文件夹前加上 .到文件名并将其重命名回原始文件名

Copy all files in folder to another folder prepending a . to the file name and rename it back to original file name

在搜索和尝试各种方法后我无法让它工作。

我需要将大量文件(超过 10 万个文件)复制到另一个文件夹,文件名前加点示例:

/foo/bar/filename1.txt 到 /foo2/bar/.filename1.txt

然后重命名回原名/foo2/bar/filename.txt

为什么我需要这样做是因为我有一个应用程序会不断扫描 /foo2/bar 文件夹及其子文件夹,并忽略那些文件名前面有一个点的文件,这样它就不会处理那些正在复制一半的文件。这主要是因为2个文件夹可以在2个不同的网络驱动器或一些挂载的设备中。

而且我不能简单地使用 mv 或 cp,因为我有一些文件太多的文件夹,它只会抛出参数列表太长的错误,因此我一直在尝试使用 find 命令但无济于事。

尝试使用不同的命令:

find /foo/bar/ -type f -exec cp -t /foo2/bar {} +

find /foo/bar/ -type f -exec mv {} /foo2/bar/.{} \;

我知道上面的命令不会做我想做的,但那是我已经厌倦的事情。

感谢任何能提供帮助的人...

使用新名称将所有文件复制到新目录:

for file in *; do   cp "$file" "./files2//.${file}"; done

$ ls -la ./files2/
total 4
 .
 ..
 .1
 .2
 .3

重命名文件:

cd files2
rename . "" .*

输出:

$ ls -la 
total 4
 .
 ..
 1
 2
 3

假设我们有两个目录如下:

$ ls -a foo*
foo1:
 .   ..   file1   file2   file3  'file 4'

foo2:
.  ..

如果我们执行下一条命令:

$ for file in foo1/* ; do base=$(basename "$file"); cp "foo1/$base" "foo2/.$base"; mv "foo2/.$base" "foo2/$base"; done

我们会在最后得到:

$ ls -a foo*
foo1:
.  ..   file1   file2   file3  'file 4'

foo2:
.   ..   file1   file2   file3  'file 4'

我想这就是你想要的。

此外,内部带空格的文件名将被正确处理。

你会尝试以下方法吗:

src="/foo/bar"
dest=/foo2/bar"
while IFS= read -r -d "" f; do
    cp -p -- "$src/$f" "$dest/.$f"
    mv -- "$dest/.$f" "$dest/$f"
done < <(find "$src" -type f -printf "%f[=10=]")

-printf "%f[=11=]"-print0 非常相似,只是它去掉了目录名称。