现有复制Archive.folder的代码仅复制文件夹,如何修改复制其内部内容?
如何复制Archive.folder内的所有内容而非文件夹本身
嗨,我来帮你搞定这个问题~你的原命令之所以只复制Archive.folder文件夹本身,是因为find返回的是文件夹的路径,cpio就会完整复制这个文件夹到目标位置。如果要复制文件夹内部的所有内容,可以根据你的需求选下面的方法:
方法1:保留原目录结构(去掉Archive.folder层级)
如果你希望每个Archive.folder里的文件保持原来的相对路径,但跳过Archive.folder这一层(比如原路径/var/CommuniGate/Accounts/user1/Archive.folder/note.txt变成archiv_mount/user1/note.txt),可以用find搭配cp的--parents选项:
find /var/CommuniGate/Accounts/ -name 'Archive.folder' -type d -exec cp -r --parents {}/* archiv_mount/ \;
细节说明:
-type d确保我们只处理文件夹,避免误匹配同名文件--parents参数会自动保留从Accounts目录开始的相对路径,这样每个用户的归档文件都会对应到目标目录下的用户子文件夹里,不会混乱。
方法2:用cpio复制(保留完整目录结构)
如果你想保留包括Archive.folder在内的完整路径,但只复制里面的内容(比如原路径/var/CommuniGate/Accounts/user1/Archive.folder/photo.jpg会变成archiv_mount/var/CommuniGate/Accounts/user1/Archive.folder/photo.jpg),可以修改find的匹配规则:
find /var/CommuniGate/Accounts/ -path '*/Archive.folder/*' | cpio -pdm archiv_mount/
细节说明:
-path '*/Archive.folder/*'会匹配所有在Archive.folder内部的文件和子文件夹,而不是文件夹本身cpio -pdm会按照原路径把这些内容复制到目标位置,自动创建需要的子目录。
方法3:所有内容合并到同一目录(不保留原路径)
如果你只是想把所有Archive.folder里的内容都放到archiv_mount根目录下(注意:同名文件会被覆盖,谨慎使用),可以用:
find /var/CommuniGate/Accounts/ -name 'Archive.folder' -type d -exec cp -r {}/* archiv_mount/ \;
处理隐藏文件的补充:
上面的*不会匹配以.开头的隐藏文件,如果需要复制隐藏文件,可以改用这个命令:
find /var/CommuniGate/Accounts/ -name 'Archive.folder' -type d -exec sh -c 'cp -r "$0"/. "$1"' {} archiv_mount/ \;
$0/.会选中文件夹内的所有内容(包括隐藏文件和子目录),完美解决隐藏文件遗漏的问题~
内容的提问来源于stack exchange,提问作者user3742929
相关产品推荐
相关产品推荐

