从find命令执行bash函数

Car*_*zón 5 bash xargs

我在bash中定义了一个函数,它检查是否存在两个文件,比较它们是否相等并删除其中一个.

function remodup {
    F=$1
    G=${F/.mod/}
    if [ -f "$F" ] && [ -f "$G" ]
    then
        cmp --silent "$F" "$G" && rm "$F" || echo "$G was modified"
    fi
}
Run Code Online (Sandbox Code Playgroud)

然后我想从find命令调用此函数:

find $DIR -name "*.mod" -type f -exec remodup {} \;
Run Code Online (Sandbox Code Playgroud)

我也试过| xargs语法.两者findxargs告诉他们``remodup`不存在.

我可以将函数移动到一个单独的bash脚本并调用脚本,但我不想将该函数复制到路径目录(还),所以我需要用绝对路径调用函数脚本或者总是调用来自同一位置的调用脚本.

(我可能可以fdupes用于这项特殊任务,但我想找到一种方法

  1. find命令调用函数;
  2. 从另一个脚本的相对路径调用一个脚本; 要么
  3. 对使用命令${F/.mod/}找到的文件使用语法(或其他bash变量操作)find.)

anu*_*ava 6

您需要先使用以下方法导出函数:

export -f remodup
Run Code Online (Sandbox Code Playgroud)

然后用它作为:

find $DIR -name "*.mod" -type f -exec bash -c 'remodup "$1"' - {} \;
Run Code Online (Sandbox Code Playgroud)


Joh*_*ica 6

你可以手动循环find结果.

while IFS= read -rd $'\0' file; do
    remodup "$file"
done < <(find "$dir" -name "*.mod" -type f -print0)
Run Code Online (Sandbox Code Playgroud)

-print0-d $'\0'使用NUL作为分隔符,允许文件名中的换行符.IFS=确保空格,因为文件名的开头不会被剥离.-r禁用反斜杠转义.所有这些选项的总和是在文件名中允许尽可能多的特殊字符而不进行修改.