我有一个文件中按某种顺序排列的文件和目录列表,我想编写一个删除它们的脚本。
目录是仅有的如果他们的所有后代也将被删除,则应该被删除。
(换句话说,只有在脚本运行多次后它们为空时才应将其删除。)
我真的更喜欢一次性完成此操作。
但在 1 遍中执行此操作似乎需要以正确的顺序执行操作(后序遍历)。
我认为这是一个已知问题...人们通常如何在 shell 脚本中解决它?
答案1
我认为这是一个已知问题...人们通常如何在 shell 脚本中解决它?
他们将文件和目录列表传递给sort -r
.
如果您从 获取文件和目录列表find
,您还可以使用该-depth
选项来确保后序遍历。
答案2
您可以尝试按文件中斜杠的数量(降序)对文件进行排序,这样您应该可以解决排序问题。
答案3
没关系,我独立解决了。
可以用 来完成awk
。请注意,该解决方案确实不是允许文件名中出现换行符。
awk -- '{a=$$0;b=$$0;print(gsub("/","/",a)-sub(/\/$$/,"aaa",b),$$0)}' INPUT_FILE.txt \
| "$(call Q2,/usr/bin/sort)" -k1,1nr \
| cut -d " " -f 2-
当我在这里时,可以通过以下方式删除重复的行:
awk -- '{pos[$$0] = NR} END { for(key in pos) reverse[pos[key]] = key; for(nr=1;nr<=NR;nr++) if(nr in reverse) print reverse[nr] }' INPUT_FILE.txt
请注意,重复数据删除是批判的如果最终递归的话,可以防止指数时间爆炸。