gpt4 book ai didi

linux - bash - 排除 "for file in $(find ...)"中的目录

转载 作者:IT王子 更新时间:2023-10-29 00:41:34 35 4
gpt4 key购买 nike

我必须做一个脚本,将所有 *.txt 文件从主目录复制到该脚本的第一个参数 (${1}) 中指定的新建目录。

如果备份目录已经存在,我想跳过它。我正在尝试在查找中排除 -prune,但它对我不起作用。最后我在循环中做了 if 语句,它也不起作用,我不知道为什么......谢谢你的帮助!

这是我的代码:

#!/bin/bash

mkdir ${1}

for file in $(find ~/ -name *.txt)

do

if [ ! -f ~/${1}/$file ]
then
cp -i -v $file -t ~/${1}
fi

done

最佳答案

应该这样做:

#!/bin/bash

[[ -n "$1" ]] || { echo >&2 'Give me an argument!'; exit 1; }

destdir=$(readlink -m -- "$1")

[[ "$destdir" == *\** ]] && { echo >&2 "Sorry, I'm in the stupid situation where the destination dir contains the \`*' character. I can't handle this."; exit 1; }

mkdir -pv -- "$destdir" || { echo >&2 "Couldn't create directory \`$destdir'. Sorry."; exit 1; }

find "$HOME" -path "$destdir" -prune -o \( -name '*.txt' -exec cp -iv -t "$destdir" -- {} \; \)

Pro:适用于名称中包含空格或有趣符号的文件(与您的文件不同)(除了一种愚蠢的情况,请参阅下面的Con)。

缺点:正如 ormaaj 在评论中指出的那样,如果目标路径的名称包含模式字符 *,这可能会失败。这种情况已被安全地考虑在内,如果发生这种情况,脚本会优雅地退出。

解释。

  • 为该脚本提供参数。它可以是相对于当前目录的绝对值。 readlink,使用 -m 选项将注意将其转换为绝对路径:即变量 destdir
  • 目录 $destdir 与其父目录一起创建(如果适用)。
  • 在主目录中,如果我们找到$destdir 目录,我们修剪这个分支,否则,我们寻找所有*.txt 文件并将它们复制到 $destdir.

再一次,对于带有有趣符号的文件名,此脚本是 100% 安全的:空格、换行符或连字符,目标目录名称中的模式字符 * 除外,但这种情况已得到处理通过优雅的退出安全地退出,而不是可能搞砸文件。

关于linux - bash - 排除 "for file in $(find ...)"中的目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14034190/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com