有一个简单的方法recursion地复制目录中的所有隐藏文件到另一个目录? 我想备份主目录中的所有设置文件,而不是普通文件。 我试过了:
cp -R .* directory
但它承认. 并..和recursion地复制所有非隐藏的文件。 有没有办法让cp忽略. 和.. ?
总的来说,我最喜欢移动Dirs:
tar cvf - . | (cd /dest/dir; tar xvf -)
它将当前目录加速到stdout,然后将其pipe理到一个子shell,该子shell在解压缩stdin之前首先将cd移到目标目录。 简单,直接,可扩展 – 考虑将()与sshreplace为另一台机器时发生的情况。 或者回答你的问题,你可能会这样做:
tar cvf - .* --exclude=\. --exclude=\.\. | (cd /dest/dir; tar xvf -)
几乎每一次都可以通过以下方式解决:
cp -R .[a-zA-Z0-9]* directory
有一个隐藏的文件不是以其中一个字符开头的,这是非常不寻常的。
其他模式匹配可用( .??* .[^.]* ) – 请参阅注释
我恳求你,远离cp命令行上的纯shell扩展 – shell扩展有各种各样的“有趣”的angular落情况(由..和..,空格,不可打印的东西,硬链接,符号链接,等等。)使用find来代替(它在findutils包中,如果你没有安装它 – 这将是奇怪的,所有的发行版默认安装它):
find -H /path/to/toplevel/dir/ -maxdepth 1 -name '.*' -a \( -type d -o -type f -o -type l \) -exec cp -a '{}' /path/to/destination/dir/ \;
一步一步的解释:
-H将导致find不遵循符号链接(除非实际的顶层目录名称是符号链接;否则将遵循)。/path/to/toplevel/dir/显然应该由你用path来代替你要备份的设置文件和目录的目录。-maxdepth 1将停止findrecursion-maxdepth 1名称以点开头的任何目录中。 我们不需要这个caching,cp会为我们做这个,我们只需要这个级别的名字。-name '.*'告诉我们需要所有以点开头的名字。 如果设置了环境variablesPOSIXLY_CORRECT,这将无法正常工作,但很less(如果有的话)是。 这是我们迄今为止指定的第一个匹配条件。a \( ....... \)是一个在括号后面跟着更复杂的条件(我用…..来代替它,下面解释)。我们需要从括号中跳过,因为它们否则会被shell的(错误的)解释,因此它们前面的反斜杠,-type d -o -type f -o -type l是它们之间或之间的三个条件。-type d匹配目录,-type f匹配常规文件,-type l匹配符号链接。 你可以select你想要的东西 – 例如,如果你不想备份设置目录,显然省略-type d(和-o就在它后面)。-exec ..... \;告诉find每次遇到匹配时执行一个命令。 命令的结尾用分号标记,我们需要用反斜线来避免shell解释。 在该命令行中,您需要在需要当前遇到的匹配名称的地方使用{}。 由于贝壳也可能会曲解大括号,因此应将它们放在撇号中,如'{}'。 在这种情况下,我们要执行的命令是cp -a '{}' /path/to/destination/dir/(-a表示存档,它在子目录中recursion,将链接复制为链接,并保留权限和扩展属性,/path/to/destination/dir/显然是目标目录的名称 – 将其replace。)
所以,用简单的英文,这个find命令行就这样说:
从/ path /到/ topervel / dir /开始。 不要下到任何子目录。 查找名称以点开头的所有目录,文件和符号链接。 对于find的所有人,将其复制到/ path / to / destination / dir /保留自然,权限和扩展属性。
我一直使用。* *来查找隐藏的文件,而没有得到“。” 和“..”。 它可能会错过“.a”或其他东西,但我从来没有其中之一。
你可以使用rsync 。
rsync -a ./ /some/other/directory/
将复制当前目录的内容(包括点文件,但不包括.. )
它描述了例如使用shopt的本地bash解决scheme