【问题标题】:Passing contents of file to extglob command terminal将文件内容传递给 extglob 命令终端
【发布时间】:2016-04-03 10:36:32
【问题描述】:

我有一个我不想从某个位置删除的文件列表,我发现通过使用 extglob 我可以使用以下方法保留一个预定义的文件列表:

rm -r !(one.txt|Folder)

这将删除除one.txt 和文件夹Folder 之外的所有内容,但是我要保留的文件列表并不总是相同。

有没有办法从文件中传递文件/文件夹列表,例如whitelist.txt 哪个不会被删除?

我已设法重新格式化 whitelist.txt 以获取内容:

one.txt|two.txt|Folder

但是我不确定如何将它传递到命令中

请注意,我正在运行 OSX 10.11。

谢谢,

【问题讨论】:

    标签: macos bash shell unix terminal


    【解决方案1】:

    由于路径名扩展发生在命令替换之后,您可以将两者结合起来:

    shopt -s extglob
    rm !($(< whitelist.txt))
    

    【讨论】:

    • 只是出于兴趣,这段代码中的 $ 做了什么?
    • @CampbellWray: $(...) 是命令替换,它扩展为封闭命令的输出。详情请见man bash
    • 很抱歉这么晚才回来,关于使用空格的任何想法,我尝试将$(...) 放在引号"$(...)" 中,但它似乎不起作用
    【解决方案2】:

    你可以使用GLOBIGNORE 有一点技巧:

    GLOBIGNORE="$(tr '\n' ':' <file.txt)"
    

    假设file.txt 包含由换行符分隔的文件名。当然别忘了给自己加上file.txt

    对于| 分隔名称:

    GLOBIGNORE="$(tr '|' ':' <file.txt)"
    

    现在你可以这样做了:

    rm *
    

    除了file.txt 中提到的文件之外的所有文件都将被删除。

    【讨论】:

    • 这适用于哪些命令?如果我想将它与 cp 或 mv 一起使用,那也可以吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-14
    • 2021-01-08
    • 2019-03-23
    • 2014-08-29
    • 2018-04-22
    • 2019-05-25
    相关资源
    最近更新 更多