我使用 Ubuntu 20.04,父文件夹下的多个子文件夹下有很多文件。我需要仅将这些子文件夹中的符号链接复制到另一个文件夹,同时保持源文件夹结构。我需要保留它们,就像完全相同的相对路径信息这样,当它们位于新的目标文件夹中时,它们仍将继续表现得与在源文件夹中相同(目标文件夹具有与源中相同的文件夹/文件)。
这就是我所拥有的:
源/文件 1
源/文件夹 1/文件 2
源/文件夹 1/符号链接 1 -> ./文件 2
源/文件夹 2/符号链接 2 -> ../文件 1
这就是我需要的(符号链接最终将被移动到一个文件夹,其中源中的所有文件都将存在于相同的文件夹结构中)
Destination\folder1\symlink1 -> ./file2
Destination\folder2\symlink2 -> ../file1
任何帮助,将不胜感激。
我已经尝试过以下这些
find ./ -type l | xargs -I % cp -va % Destination/
Result: all symlinks get copied to destination folder but they lose the source folder structure.
find . -type l | xargs -i cp {} Destination{}
Result: cp: cannot create regular file 'Destination./tools/i18n-uitext/node_modules/istanbul-lib-source-maps/node_modules/.bin/rimraf': No such file or directory
这里(下面)是我在源文件夹中的一些符号链接。
使用源目录中的命令列出下面的符号链接find ./ -type l -print0 | xargs -0 ls -plah
。我打算将这些符号链接复制到另一个目录,它们需要保持相同的文件夹结构。
注意:源目录是一台服务器上的 CI 机器工作区文件夹,目标目录是此工作区文件夹之外的文件夹,我需要将这些符号链接和包含它们的文件夹复制到该文件夹中。
lrwxrwxrwx 1 19 Jul 4 18:08 ./integrations/link_adyen_v20_1_3/node_modules/.bin/_mocha -> ../mocha/bin/_mocha
lrwxrwxrwx 1 18 Jul 4 18:08 ./integrations/link_adyen_v20_1_3/node_modules/.bin/acorn -> ../acorn/bin/acorn
lrwxrwxrwx 1 19 Jul 4 18:08 ./integrations/link_adyen_v20_1_3/node_modules/.bin/atob -> ../atob/bin/atob.js
lrwxrwxrwx 1 19 Jul 4 18:05 ./node_modules/.bin/_mocha -> ../mocha/bin/_mocha
lrwxrwxrwx 1 18 Jul 4 18:05 ./node_modules/.bin/acorn -> ../acorn/bin/acorn
lrwxrwxrwx 1 19 Jul 4 18:05 ./node_modules/.bin/atob -> ../atob/bin/atob.js
lrwxrwxrwx 1 32 Jul 4 18:05 ./node_modules/.bin/autoprefixer -> ../autoprefixer/bin/autoprefixer
lrwxrwxrwx 1 20 Jul 4 18:05 ./node_modules/@babel/compat-data/node_modules/.bin/semver -> ../semver/bin/semver
lrwxrwxrwx 1 20 Jul 4 18:05 ./node_modules/@babel/core/node_modules/.bin/semver -> ../semver/bin/semver
lrwxrwxrwx 1 22 Jul 4 18:05 ./node_modules/caniuse-api/node_modules/.bin/browserslist -> ../browserslist/cli.js
lrwxrwxrwx 1 23 Jul 4 18:05 ./node_modules/core-js-compat/node_modules/.bin/semver -> ../semver/bin/semver.js
lrwxrwxrwx 1 20 Jul 4 18:08 ./tools/i18n-uitext/node_modules/.bin/semver -> ../semver/bin/semver
lrwxrwxrwx 1 21 Jul 4 18:08 ./tools/i18n-uitext/node_modules/.bin/uuid -> ../uuid/dist/bin/uuid
lrwxrwxrwx 1 18 Jul 4 18:08 ./tools/i18n-uitext/node_modules/.bin/which -> ../which/bin/which
lrwxrwxrwx 1 20 Jul 4 18:08 ./tools/i18n-uitext/node_modules/fstream/node_modules/.bin/mkdirp -> ../mkdirp/bin/cmd.js
lrwxrwxrwx 1 16 Jul 4 18:08 ./tools/i18n-uitext/node_modules/fstream/node_modules/.bin/rimraf -> ../rimraf/bin.js
答案1
进入
Source
目录:cd /path/to/Source
管道
find . -type l
至tar --files-from=-
。我可以看到您的find
支持-print0
,请使用它:find . -type l -print0 | tar -c --null --files-from=- -f symlinks.tar
复制或移动
symlinks.tar
到Destination
目录。cd
到目录。提取如下:
tar -xf symlinks.tar
即使Source
和Destination
位于两台不同的机器上,只要您可以将文件从一台机器复制到另一台机器,这也会起作用。
如果Source
和Destination
都属于同一台机器上的目录层次结构,则不需要任何中间常规文件。将一个文件传输tar
到另一个文件:
( cd /path/to/Source && find . -type l -print0 | tar -c --null --files-from=- ) \
| ( cd /path/to/Destination && tar -x )
笔记:
cd … && foo …
foo
仅当成功时才会运行cd
。这是正确的做法。一般来说,我们的
tar -x
不需要目录结构预先存在;如果需要,它将创建目录以放置符号链接。但不要指望这些新创建的目录会从 中的子目录接收属性(例如模式)Source
。原因是我们的tar -c
不存储有关目录的信息。它只存储有关符号链接的信息,因为我们find
只找到符号链接。符号链接的路径(从 接收find
)可能包含目录组件,tar -x
并将使用此信息在需要时创建子目录,但仅此而已。没有关于任何目录的信息本身可用。