我只需要将父文件夹下的多个子文件夹中的符号链接复制到另一个文件夹,并在符号链接中保留相对路径信息

我只需要将父文件夹下的多个子文件夹中的符号链接复制到另一个文件夹,并在符号链接中保留相对路径信息

我使用 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

  1. 进入Source目录:

    cd /path/to/Source
    
  2. 管道find . -type ltar --files-from=-。我可以看到您的find支持-print0,请使用它:

    find . -type l -print0 | tar -c --null --files-from=- -f symlinks.tar
    
  3. 复制或移动symlinks.tarDestination目录。cd到目录。

  4. 提取如下:

     tar -xf symlinks.tar
    

即使SourceDestination位于两台不同的机器上,只要您可以将文件从一台机器复制到另一台机器,这也会起作用。

如果SourceDestination都属于同一台机器上的目录层次结构,则不需要任何中间常规文件。将一个文件传输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并将使用此信息在需要时创建子目录,但仅此而已。没有关于任何目录的信息本身可用。

相关内容