Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 将文件夹中的所有文件复制到另一个文件夹中,然后将其添加到。更改为文件名并将其重命名回原始文件名_Linux_Bash_Centos7_File Rename_File Copying - Fatal编程技术网

Linux 将文件夹中的所有文件复制到另一个文件夹中,然后将其添加到。更改为文件名并将其重命名回原始文件名

Linux 将文件夹中的所有文件复制到另一个文件夹中,然后将其添加到。更改为文件名并将其重命名回原始文件名,linux,bash,centos7,file-rename,file-copying,Linux,Bash,Centos7,File Rename,File Copying,在用各种方法搜索和尝试之后,我无法让它工作 我需要将大量超过10万个文件复制到另一个文件名前面带有点的文件夹示例: /foo/bar/filename1.txt到/foo2/bar/.filename1.txt 然后将其重新命名为原始名称/foo2/bar/filename.txt 我之所以需要这样做,是因为我有一个应用程序,它将不断扫描/foo2/bar文件夹及其子文件夹,并忽略那些文件名前面有一个点的文件,这样它就不会处理那些正在复制的文件。这主要是因为2文件夹可以位于2个不同的网络驱动器或

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

我需要将大量超过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 {} +
$ for file in foo1/* ; do base=$(basename "$file"); cp "foo1/$base" "foo2/.$base"; mv "foo2/.$base" "foo2/$base"; done

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


感谢所有能够帮助您的人……

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

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:
.  ..
如果我们执行下一个命令:

find /foo/bar/ -type f -exec cp -t /foo2/bar {} +
$ 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\0")

-printf%f\0与-print0类似,只是它去掉了目录名。

将整个结构复制到/foo3,完成后,将/foo3重命名为/foo2。这样,,扫描/foo2的应用程序不会被复制了一半的文件所愚弄,直到复制完成并且文件夹被重命名为最终名称。我不认为我可以这样做,因为/foo2可能是一个网络驱动器文件夹,比如samba服务器。你能不能将文件标记为.mytar.tar.gz,然后将其解压缩?你的意思是所有文件都必须复制在删除圆点之前?或者每个文件都可以在特定文件的副本完成后立即删除其点?@JL007作为网络驱动器的问题是什么?您可以在同一网络驱动器中创建/foo3,复制完成后,只需重命名该文件夹。重命名是即时的。答案很好,但如果我胆敢太挑剔,如果文件名末尾包含换行符,它就会中断。谁在乎呢@齐奥诺:哈哈。我不知道有多少人能够创建一个名称中有\n或“/”的文件。哈哈,绝对是:天哪!这正是我所需要的,解决了我的问题。已经测试过了。它是如此简单和优雅!真不敢相信我竟然没想到。非常感谢你++我并没有真正尝试过,但无论如何还是要感谢你的帮助!我希望它被重命名回原始文件名后,立即完成复制,以便它可以立即处理,我想我忘了在我的问题中提到它,分解成几个部分不是我想要的,但无论如何谢谢你的帮助!!!所以把重命名放在循环中-我把它作为一个不同的步骤来显示一步一步的分解