Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.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_Perl_Shell_Solaris_Ksh - Fatal编程技术网

Linux 自动重新创建许多指向重命名目录或文件的不同链接

Linux 自动重新创建许多指向重命名目录或文件的不同链接,linux,perl,shell,solaris,ksh,Linux,Perl,Shell,Solaris,Ksh,我需要重命名Linux/Solaris机器中的许多目录和文件。 有许多指向这些目录/文件的链接 因此,首先我创建以下脚本,以查找我要重命名的所有目录(如DOMAIN.city.country,DOMAIN.type.country等) 以及它们的链接 脚本从文件info.filefile中获取节点的新旧名称。每行中的第一个字段表示旧目录名,第二个字段表示新目录名 文件查找并重新创建链接到新目录ksh while read -r line ; do [[ -z $line ]] &&a

我需要重命名Linux/Solaris机器中的许多目录和文件。 有许多指向这些目录/文件的链接

因此,首先我创建以下脚本,以查找我要重命名的所有目录(如
DOMAIN.city.country
DOMAIN.type.country
等) 以及它们的链接

脚本从文件
info.file
file中获取节点的新旧名称。每行中的第一个字段表示旧目录名,第二个字段表示新目录名

文件
查找并重新创建链接到新目录ksh

while read -r line ; do 

[[ -z $line ]] && continue

name_old_dir=` echo $line | awk '{print $1}' `
name_new_dir=` echo $line | awk '{print $2}' `

find / -type l -exec ls -l 2>/dev/null '{}' \; |  perl -ne'BEGIN { $str = shift(@ARGV); }     print if /\Q$str\E/; ' $name_old_dir

done  < /tmp/test/info.file
当我运行脚本时,我得到了这个输出

lrwxrwxrwx 1 root root 19 Mar 15 11:22 /var/test/info.domain2.com -> DOMAIN.city.country
lrwxrwxrwx 1 root root 19 Mar 15 11:22 /var/test/info.domain.com -> DOMAIN.city.country
lrwxrwxrwx 1 root root 19 Mar 15 11:22 /var/test/info.domain1.com -> DOMAIN.city.country
lrwxrwxrwx 1 root root 5 Mar 15 11:57 /var/test/DOMAIN.type.country -> mkdir
lrwxrwxrwx 1 root root 19 Mar 15 11:58 /var/test/info.tyep.com -> DOMAIN.type.country
...
现在我需要在这个脚本中添加一个部分,该部分将重新创建到新目录的当前链接。比如说

/var/test/info.domain2.com -> DOMAIN.world.country

请建议自动重新创建到新目录的当前链接的最佳解决方案。

如果我正确理解此问题,您希望根据来自
find_和\u recreate_link_to_new_dir.ksh
的信息创建符号链接

所以如果你得到

lrwxrwxrwx 1 root root 19 Mar 15 11:22 /var/test/info.domain2.com -> DOMAIN.city.country
您将要创建链接

/var/test/info.domain2.com -> DOMAIN.city.country
在这种情况下,我建议您存储这两个参数并使用它们调用
ln-s
。将数据保存在一个文件中可能很有趣,比如使用新数据保存文件:

find / -type l -exec ls -l 2>/dev/null '{}' \; |  perl -ne'BEGIN { $str = shift(@ARGV); }     print if /\Q$str\E/; ' $name_old_dir >> FILE_WITH_NEW_DATA
然后,给定字符串

lrwxrwxrwx 1 root root 19 Mar 15 11:22 /var/test/info.domain2.com -> DOMAIN.city.country
您可以通过以下方式获取参数:

link = $(awk 'N=NF-2 {print $N}')
file = $(awk '{print $NF}')
然后使用
ln-s$file$link
创建符号链接

总的来看,

... 

find / -type l -exec ls -l 2>/dev/null '{}' \; |  perl -ne'BEGIN { $str = shift(@ARGV); }     print if /\Q$str\E/; ' $name_old_dir >> FILE_WITH_DATA

...


while read -r line ; do 

  [[ -z $line ]] && continue

  link = $(echo $line | awk 'N=NF-2 {print $N}')
  file = $(echo $line | awk '{print $NF}')

  # begin OPTION 1) we delete previous link
  rm $link
  ln -s $file $link
  # end OPTION 1)

  # begin OPTION 2) we force the link to be created and replace the older one
  ln -s -f $file $link
  # end OPTION 2)

done  < FILE_WITH_NEW_DATA
。。。
find/-type l-exec ls-l 2>/dev/null'{}'\\ |perl-ne'BEGIN{$str=shift(@ARGV);}print if/\Q$str\E/;'$名称\u旧\u目录>>包含\u数据的文件\u
...
而read-r行;做
[[-z$line]]&继续(&C)
link=$(echo$行| awk'N=NF-2{print$N}')
文件=$(echo$行| awk'{print$NF}')
#开始选项1)我们删除上一个链接
rm$link
ln-s$file$link
#结束选项1)
#开始选项2)我们强制创建链接并替换旧链接
ln-s-f$文件$链接
#结束选项2)
完成<使用新数据归档\u

如果我正确理解了这个问题,您希望根据来自
查找并重新创建链接到新目录ksh
的信息创建符号链接

所以如果你得到

lrwxrwxrwx 1 root root 19 Mar 15 11:22 /var/test/info.domain2.com -> DOMAIN.city.country
您将要创建链接

/var/test/info.domain2.com -> DOMAIN.city.country
在这种情况下,我建议您存储这两个参数并使用它们调用
ln-s
。将数据保存在一个文件中可能很有趣,比如使用新数据保存文件:

find / -type l -exec ls -l 2>/dev/null '{}' \; |  perl -ne'BEGIN { $str = shift(@ARGV); }     print if /\Q$str\E/; ' $name_old_dir >> FILE_WITH_NEW_DATA
然后,给定字符串

lrwxrwxrwx 1 root root 19 Mar 15 11:22 /var/test/info.domain2.com -> DOMAIN.city.country
您可以通过以下方式获取参数:

link = $(awk 'N=NF-2 {print $N}')
file = $(awk '{print $NF}')
然后使用
ln-s$file$link
创建符号链接

总的来看,

... 

find / -type l -exec ls -l 2>/dev/null '{}' \; |  perl -ne'BEGIN { $str = shift(@ARGV); }     print if /\Q$str\E/; ' $name_old_dir >> FILE_WITH_DATA

...


while read -r line ; do 

  [[ -z $line ]] && continue

  link = $(echo $line | awk 'N=NF-2 {print $N}')
  file = $(echo $line | awk '{print $NF}')

  # begin OPTION 1) we delete previous link
  rm $link
  ln -s $file $link
  # end OPTION 1)

  # begin OPTION 2) we force the link to be created and replace the older one
  ln -s -f $file $link
  # end OPTION 2)

done  < FILE_WITH_NEW_DATA
。。。
find/-type l-exec ls-l 2>/dev/null'{}'\\ |perl-ne'BEGIN{$str=shift(@ARGV);}print if/\Q$str\E/;'$名称\u旧\u目录>>包含\u数据的文件\u
...
而read-r行;做
[[-z$line]]&继续(&C)
link=$(echo$行| awk'N=NF-2{print$N}')
文件=$(echo$行| awk'{print$NF}')
#开始选项1)我们删除上一个链接
rm$link
ln-s$file$link
#结束选项1)
#开始选项2)我们强制创建链接并替换旧链接
ln-s-f$文件$链接
#结束选项2)
完成<使用新数据归档\u

您的脚本效率不高。对于要映射的每个文件,它运行两次
awk
(与下面的操作相比,这是一个小错误),然后在整个机器上运行
find
,查找符号链接,并对每个符号链接运行
ls
,只选择显示旧名称的链接

遍历整个文件系统的速度非常慢;你只能做一次

我认为您应该使用更复杂的Perl脚本(因为您已经在使用Perl)来完成大部分工作,但是您可以保留
find
命令,尽管也可以使用Perl的File::find(核心)模块

Perl脚本将获得映射文件(
/tmp/test/info.file
)作为参数,以及来自
find
命令的符号链接:

  • 读取文件中的行
  • 相应地重命名文件
  • 还将旧名称和新名称记录在哈希中以进行映射

  • 读取符号链接名称的标准输入

  • 使用readlink读取符号链接的目标
  • 如果链接与任何旧名称匹配
    • 拆下旧的链接
    • 创建新链接
shell脚本变为:

find / -type l -print | perl rebuild.links.pl /tmp/test/info.file
Perl脚本变为(警告-未测试代码):

#/usr/bin/env perl
严格使用;
使用警告;
我的%map;
die“用法:$0映射文件\n”,除非@ARGV==1;
{
在顶部打开我的$fh,'1;
  • 打印而不是执行
    取消链接
    符号链接
    重命名
    等,条件是
    如果调试;
  • 在子目录上运行
    find
    命令,而不是
    /
    ,直到我确定知道发生了什么

  • 小心-这是危险的东西。

    您的脚本效率不高。对于要映射的每个文件,它都会运行两次
    awk
    (与以下内容相比,这是一个小错误),然后在整个计算机上运行
    find
    ,查找符号链接,并对每个符号链接运行
    ls
    ,仅选择显示旧名称的链接

    遍历整个文件系统的速度非常慢;您只能进行一次

    我认为您应该使用更复杂的Perl脚本(因为您已经在使用Perl)来完成大部分工作,但是您可以保留
    find
    命令,尽管也可以使用Perl的File::find(核心)模块

    Perl脚本将获得映射文件(
    /tmp/test/info.file
    )作为参数,以及来自
    find
    命令的符号链接:

    • 读取文件中的行
    • 相应地重命名文件
    • 还记录旧名称和新名称