将文件夹中的所有文件复制到另一个文件夹前加上 .到文件名并将其重命名回原始文件名
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
非常相似,只是它去掉了目录名称。
在搜索和尝试各种方法后我无法让它工作。
我需要将大量文件(超过 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
非常相似,只是它去掉了目录名称。