【问题标题】:How to recursively copy files while removing part of the path如何在删除部分路径的同时递归复制文件
【发布时间】:2018-12-19 04:50:41
【问题描述】:

我有数百个图像文件,结构如下:

path/to/file/100/image1.jpg

路径/到/文件/9999/image765.jpg

path/to/file/333/picture2.jpg

我想删除路径的第 4 部分 (100,9999,333, ...),以便得到以下信息:

路径/到/文件/image1.jpg

路径/到/文件/image765.jpg

路径/到/文件/picture2.jpg

在这种情况下,图像文件名没有重复,并且目标目录可以命名完全不同,如果这样可以使事情变得更容易(例如,目标可以是“another/path/to/the/images/image1.jpg”

解决方案可能是查找/剪切/重命名命令的某种组合。

如何在 bash 中做到这一点?

【问题讨论】:

  • 这个问题之前在 stackoverflow 和其他网站上已经回答过很多次了。你尝试过什么来解决这个问题?我在您的问题中遗漏了一些研究和代码尝试。

标签: bash


【解决方案1】:

由于您只有“数百”个文件,因此您很可能不需要做任何特别的事情,只需编写即可:

mv path/to/file/*/*.jpg path/to/file/

但是根据文件的数量和名称的长度,这可能会超出内核允许您传递给单个命令的数量,在这种情况下,您可能需要编写一个 for-loop 来代替:

for file in path/to/file/*/*.jpg ; do
    mv "$file" path/to/file/
done

(当然,这假设您的路径上有 mv。没有用于重命名文件的 Bash 内置函数,因此任何方法都取决于您的系统上还有什么可用的。如果您没有 mv ,您需要相应地调整上述内容。)

【讨论】:

    【解决方案2】:

    如果可行,我建议使用 ruakh 的解决方案,但如果您需要显式测试这些数字目录,这里有一个替代方案。

    我只是使用echo 来管道输入名称列表,并在最后显示mv,但您可以使用find(评论中的示例)并删除echo on mv 让它活起来。

    IFS=/ 
    echo "path/to/file/100/image1.jpg
    path/to/file/9999/image765.jpg
    path/to/file/333/picture2.jpg" |
    #   find path/to/file -name "*.jpg" |
    while read -r orig
    do this=""
       read -a line <<< "$orig" 
       for sub in "${line[@]}"
       do  if [[ "$sub" =~ ^[0-9]+$ ]]
           then continue
           else this="$this$sub/"
           fi
       done
       old="${line[*]}"
       echo mv "$old" "${this%/}" 
    done
    mv path/to/file/100/image1.jpg  path/to/file/image1.jpg
    mv path/to/file/9999/image765.jpg  path/to/file/image765.jpg
    mv path/to/file/333/picture2.jpg path/to/file/picture2.jpg
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-06
      • 1970-01-01
      • 2011-01-12
      • 1970-01-01
      • 1970-01-01
      • 2017-09-30
      • 1970-01-01
      相关资源
      最近更新 更多