编写使每个可写普通类型文件编号列表的脚本

时间:2019-06-17 05:51:20

标签: linux bash

我需要制作某种hdguard脚本。我被卡住了,因为我必须列出所有可写普通类型文件的编号列表(没有链接目录等)。列表必须仅包含文件的名称和大小。然后,我必须选择要按数字删除的文件。

我尝试了各种echo函数和ls函数,但没有办法令我满意。

find

是我能找到的最接近的文件,但它不会在子目录和目录中显示文件(必须仅显示可写文件)。

所需的输出:

ls -Ss1pq --block-size=1

在我选择了“ 1”之后,脚本必须制作txt文件,并列出每个所选文件的路径。

所以,我有这个

1. [size] [filename]
2. [size2] [filename2]
...

越来越好

find /homee -type f -not -path '/\.*' |sort -r -n -k7

但是如何仅显示名称而不显示路径?

我也可以选择

find /homee -type f - ls -not -path '/\.*' -exec du -hs {} + |sort -r -n -k7

,但是现在没有文件大小 我该怎么办?

2 个答案:

答案 0 :(得分:0)

将行号输入文件的一种非常简单的方法是在空字符串上使用grep -n,如您所见:

Prompt> cat testtttt.txt
First line
Second line
Third line
Prompt> grep -n "" testtttt.txt
1:First line
2:Second line
3:Third line

-n添加找到条目的行号,并通过搜索一个空字符串(可以在每行中找到)来获得一种行号。

答案 1 :(得分:0)

Bash 4+可以使用mapfile从标准输入生成一个数组。 select是用于生成菜单的工具。 Ctrl + D退出。

mapfile -t Files < <(
  find . -type f -not -path '*/\.*' \
         -exec du -h {} + |sort -r
)
select f in "${Files[@]##*$'\t'}"; do rm -i "$f"; done

du的输出是制表符分隔的,因此"${Files[@]##*$'\t'}"

  • ${Files[@]}-数组Files
  • 的所有元素
  • ${variable##pattern}-从pattern减去variable的所有最左边出现的
  • *$'\t'-后跟文字标签的任何内容