我正在尝试编写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。非常感谢您的帮助。
您的两个问题都有相同的原因:您没有将变量
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 {} +
当您使用 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)