gpt4 book ai didi

bash - 如果文件名不是零字节,则将文件名添加到 txt 文件

转载 作者:行者123 更新时间:2023-12-05 04:33:29 26 4
gpt4 key购买 nike

我想将满足一组条件的文件添加到 txt 文件中,以便以后轻松传输,我这样做:

ls -1 > AllFilesPresent.txt

value=$(<AllFilesPresent.txt)

rm AllFilesPresent.txt

for val in $value; do
case $val in
(Result*.RData) echo "$val" >> CompletedJobs.txt ;;
esac
done

我遇到过一些文件损坏并显示为零字节文件的情况,我可以手动找到这些文件:

find . -size 0 -maxdepth 1

如何调整我的循环以拒绝零字节文件?

最佳答案

代码

ls -1 > AllFilesPresent.txt
value=$(<AllFilesPresent.txt)
rm AllFilesPresent.txt
for val in $value; do

具有与

基本相同的功能
for val in $(ls -1); do

这通常不起作用。如果文件名中有空格或 glob 字符,它会中断,至少。参见 Bash Pitfalls #1 (for f in $(ls *.mp3)) .此外,在程序中使用 ls 的输出存在特殊问题。它只适合交互使用。参见 Why you shouldn't parse the output of ls(1) .

一个正确的、完全安全的、更短更快的替代方案是:

for val in *; do

您问题的完整解决方案是:

shopt -s nullglob
for file in Result*.RData; do
[[ -f $file && -s $file ]] && printf '%s\n' "$file"
done >CompletedJobs.txt
  • shopt -s nullglob 防止 glob 模式在不匹配任何文件时扩展为(相当于)垃圾。
  • 我已将 val 替换为更有意义(无论如何对我而言)的 file
  • Result*.RData 导致循环仅处理与该模式匹配的文件。
  • 我添加了一个-f $file 测试以避免处理任何可能存在的非文件内容(目录、fifos、...)。它仍然允许通过符号链接(symbolic link)到文件。你可能不想要那样。你可以添加一个! -L $file && 如果您想排除符号链接(symbolic link),则在测试表达式的开头。
  • 我已将 echo "$val" 替换为 printf '%s\n' "$val" 因为原始代码通常不起作用。查看对 Why is printf better than echo? 的已接受且优秀的答案.
  • 我已将重定向移至循环外的 CompletedJobs.txt,正如@CharlesDuffy 在 comment 中所建议的那样.
  • 请注意,如果任何文件的名称中有换行符,此代码将不起作用(例如,使用 echo data > $'Result\n1.RData' 创建一个文件)。这是非常罕见的,但有可能。在文件中安全存储一般未加引号的文件名的唯一方法是用 ASCII NUL 字符(不能出现在文件名中)将它们分隔开。为此,将 printf ... 替换为 printf '%s\0' "$file"。这意味着 CompletedJobs.txt 不再是文本文件。它还需要修改任何读取文件的工具。

您也可以只使用 find 来做到这一点:

find . -maxdepth 1 -type f -name 'Result*.RData' -not -size 0 -printf '%P\n' >CompletedJobs.txt
  • 带有 -printf%P 格式从输出中删除前导 ./,因此您得到 Result2.RData 而不是 ./Result2.RData(默认情况下 find 会打印,或者使用 -print 选项)。
  • \n 替换为 \0 以使输出对于任何可能的文件名都是安全的。

关于bash - 如果文件名不是零字节,则将文件名添加到 txt 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71401272/

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