Bash - 使用单个文件以递归方式替换特定类型的所有文件,保留原始文件名

时间:2018-02-22 23:53:55

标签: bash recursion replace

假设我有一个目录,我需要递归遍历,查找某个类型的每个文件(* .jpeg),并用一个唯一文件(placeholder.jpeg)替换每个匹配的事件但是我想保留原始文件名

我用一个小的占位符图像替换大型目录结构中的所有jpeg图像,但我需要保持原始文件名不变。

这是一个递归的find-file-by-type-and-replace,但保留原始文件名。

这几乎可以起作用:

#! /bin/bash

shopt -s globstar

for f in /tmp/**/*.jpeg
do
 cp /tmp/placeholder.jpeg $f
done

2 个答案:

答案 0 :(得分:1)

我不清楚你的占位符文件总是在你正在进行替换的目录结构之外。

各种find版本都有一个-samefile选项来检测特定文件,因此您可以避免调用cp来发出“...是同一个文件”警告:

find /tmp \
    -name '*.jpeg' ! -samefile /tmp/placeholder.jpeg \
    -exec cp /tmp/placeholder.jpeg  {} \;

您可以通过将-exec cp ...替换为-exec echo cp ...进行测试,以便在不执行此操作的情况下查看预期的副本。

答案 1 :(得分:0)

试试这个:find /tmp/ -name \*.jpeg -print0 | xargs -0I'{}' cp placeholder.jpeg {}