find -exec sh -c '...' 脚本不遵守外部脚本中设置的变量

问题描述 投票:0回答:2

我正在尝试编写shell脚本来检查和删除文件/文件夹

#!/bin/bash

deletepath="path"
donotdelete="$2"

timestamp=$(date +%Y%m%d_%H%M%S)
filename=log_$timestamp.txt

logpath="logpath.txt"

find "$deletepath" -maxdepth 5 -exec sh -c '
for dir; do

    # Log the mtime and the directory name
    stat -c "%y %n" "$dir" >> "$logpath"

    if [ "$donotdelete" = "false" ]; then
        echo "deleting files"
    fi

done
' sh {} +

我的 2 条线路有问题

stat -c "%y %n" "$dir" >> "$logpath" 

由于某种原因,$logpath 未被替换,并且显示权限错误。

if 条件不起作用,并且始终打印 deleting files。非常感谢您的帮助。

linux shell sh
2个回答
1
投票

您的两个问题都有相同的原因:您没有将变量

logpath
donotdelete
传递到需要使用它们的
sh
的副本中。

使用

export
将 shell 变量复制到环境中,子进程可以使用它们,在行的开头自行分配它们,如下所示:


logpath="$logpath" donotdelete="$donotdelete" find "$deletepath" \
  -maxdepth 5 -exec sh -c '
for dir; do

    # Log the mtime and the directory name
    stat -c "%y %n" "$dir" >> "$logpath"

    if [ "$donotdelete" = "false" ]; then
        echo "deleting files"
    fi

done
' sh {} +

0
投票

当您使用 bash 时,您可以通过根本不调用

sh
来稍微优化代码:

deletepath="path"
donotdelete="$2"

timestamp=$(date +%Y%m%d_%H%M%S)
filename=log_$timestamp.txt

logpath="logpath.txt"

while IFS= read -r -d '' dir
do
    # Log the mtime and the directory name
    stat -c "%y %n" "$dir" >> "$logpath"

    if [ "$donotdelete" = "false" ]; then
        echo "deleting files"
    fi
done < <(find "$deletepath" -maxdepth 5 -print0)
© www.soinside.com 2019 - 2024. All rights reserved.