【问题标题】:How to find,copy and rename files in linux?如何在 linux 中查找、复制和重命名文件?
【发布时间】:2013-11-24 18:11:09
【问题描述】:

我正在尝试查找目录和子目录中的所有文件,然后将它们复制到不同的目录。但是其中一些具有相同的名称,因此我需要将文件复制过来,然后如果有两个文件具有相同的名称,请重命名其中一个文件。

到目前为止,我已经成功地复制了所有找到的具有唯一名称的文件:

#!/bin/bash
if [ ! -e $2 ] ; then
    mkdir $2
    echo "Directory created"
fi
if [ ! -e $1 ] ; then
    echo "image source does not exists"
fi
find $1 -name IMG_****.JPG -exec cp {} $2 \;

但是,我现在需要某种 if 语句来确定一个文件是否与另一个已复制的文件同名。

【问题讨论】:

  • 你真的在****中做了find吗?
  • 一个* 匹配所有,你不需要四个。如果您想精确匹配四个字符,您可以使用????,其中每个? 只匹配一个字符。此外,您需要引用"IMG_????.JPG"(就像我所做的那样)以防止外壳扩展它。您可能很幸运,在您调用find 的目录中没有IMG_????.JPG,因此模式保持不变。
  • 啊,我明白了,是的,我刚刚在那里测试过。谢谢:)
  • 当然!我建议阅读此页面:mywiki.wooledge.org/BashPitfalls 它有很好的信息,初学者(包括我自己)通常会在 bash 上出错。

标签: linux bash shell copy rename


【解决方案1】:

您可以将 rsync 与以下开关一起使用以获得更多控制

 rsync --backup --backup-dir=DIR --suffix=SUFFIX -az <source dire> <destination dir>

这里(来自man page

-b, --backup

使用此选项,在传输或删除每个文件时重命名预先存在的目标文件。您可以使用 --backup-dir 和 --suffix 选项控制备份文件的位置以及附加什么(如果有)后缀。

--backup-dir=DIR

结合 --backup 选项,这告诉 rsync 将所有备份存储在接收端的指定目录中。这可用于增量备份。您还可以使用 --suffix 选项指定备份后缀(否则指定目录中备份的文件将保留其原始文件名)。

--suffix=SUFFIX

此选项允许您覆盖与 --backup (-b) 选项一起使用的默认备份后缀。如果没有指定 --backup-dir,则默认后缀为 ~,否则为空字符串。

您可以使用rsycn 同步本地文件系统或远程文件系统上的两个文件夹。您甚至可以通过ssh 连接进行同步。

rsync 非常强大。有关所有选项,请参阅 man page

【讨论】:

    【解决方案2】:

    你可以这样做:

    for file in $1/**/IMG_*.jpg ; do  
      target=$2/$(basename "$file") 
      SUFF=0 
      while [[ -f "$target$SUFF" ]] ; do 
        (( SUFF++ )) 
      done
      cp "$file" "$target$SUFF"
    done
    

    在您的脚本中代替 find 命令将整数后缀附加到同名文件

    【讨论】:

      【解决方案3】:

      试试这个方法:把文件列表放在一个变量中,然后复制每个文件,看看复制操作是否成功。如果没有,请尝试其他名称。

      在代码中:

      FILES=`find $1 -name IMG_****.JPG | xargs -r`
      for FILE in $FILES; do
          cp -n $FILE destination
          # Check return error of latest command (i.e. cp)
          # through the $? variable and, in case
          # choose a different name for the destination
      done
      

      在for语句内部,你也可以放一些增量整数,以增量方式尝试不同的名字(例如name_1、name_2等,直到cp命令成功)。

      【讨论】:

      • cp 只会覆盖现有文件
      • 这不是空运行模式:在我的 Linux 发行版上 cp -n a b 如果 b 不存在,则将 a 复制到 b 中。
      • 你是对的,-n--no-clobber。我将它与其他命令中的标志混淆了。现在答案很好。
      • 对不起,我应该在问题中提到我只是第一次学习linux,所以你能解释一下你的代码部分是做什么的吗?对不起。
      【解决方案4】:

      由于您使用的是 linux,因此您可能正在使用 coreutils 中的cp。如果是这种情况,请使用 cp --backup=t 让它为您进行备份

      【讨论】:

      • 我还没有设法让它工作,但这对我来说似乎是正确的方向
      猜你喜欢
      • 2020-03-24
      • 2015-05-09
      • 1970-01-01
      • 2015-08-15
      • 2016-04-09
      • 2016-11-30
      • 2013-06-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多