如何在文件输出的同时输出文件大小?

如何在文件输出的同时输出文件大小?

我编写了一个搜索文件然后输出它的脚本。该脚本一直有效,直到我尝试使用该命令为止du。代码是:

#!/bin/bash

echo "Enter either file name or format:"
    read File

echo "Input the absolute path to directory:"
    read Dir

echo "Enter \"/path/to/directory/filename\" to store outputs on the filename:"
    read results

#cd $Dir; 
#for dir in */; do 
#   echo $Dir; 
#done | xargs -P0 -I_ echo "sudo find _ -type f -name \*$File\* " > temp.txt

cd $Dir; 
for dir in */; do 
  echo $dir; 
done | xargs -P0 -I_ sudo find _ -type f -name \*$File\* | du >> $results

基本上,它会搜索您想要搜索输入文件的目录,并xargs在那里利用尽可能多的核心。

我现在只需要输出文件的大小以及将输出到该results文件的文件。我自己这样做会给我错误的输出,其中包含每个目录,并且找不到我搜索的文件。有任何想法吗?

答案1

你的代码有一些错误

cd $Dir

不应在脚本中使用,因为cd可能会失败,但您的脚本仍在继续(并且会因文件夹名称中的空格而失败)。最好检查一下是否cd成功,两个例子:

cd "$Dir" || exit 2
cd "$Dir" && for dir in */; do

sudo不应该在脚本中使用。更好地以正确的权限运行脚本(只是意见)

sudo find _ -type f -name \*$File\*

find如果需要循环,可以放在循环内部,不需要xargs(意见)

for dir in */; do echo $dir; done

for 循环的意义不大(因为里面什么都没有),可以用ls -d */.它只会打印子文件夹(排除以 开头的隐藏.),甚至find */直接打印也可以(更好cd "$Dir" && find ./*/

\*$File\* | du >> $results

不要将字符串传递给du它,它不会执行您期望的操作。将文件名作为参数,您可以使用xargs或更好地使用 find 来执行此操作-exec\;以单独处理每个文件,或以+一次传递所有文件名作为参数)

for dir in */; find "$dir" -type f -iname "*$File*" -exec du {} + >> "$results"; done

但是,您可以直接在父find文件夹上运行它,而不是在子文件夹上运行,并且对于文件大小,我建议使用所需的输出,例如(除非您确实想要磁盘使用情况)"$dir""$Dir"-mindepth 2statstat -c %s$'\t'%n

find "$Dir" -mindepth 2 -type f -iname "*$File*" -exec stat -c %s$'\t'%n {} + >> "$results"

或者xargs -0如果传递给的参数太多stat

find "$Dir" -mindepth 2 -type f -iname "*$File*" -print0 | xargs -0 -P0 stat -c %s$'\t'%n >> "$results"

为了更安全地处理文件夹名称,我建议使用 find while read 循环以 NUL 终止结果(GNU 扩展-print0),请参阅此答案以供参考(尽管xargs -I_ find _您已经找到了可行的解决方案)

如何循环查找find返回的文件名?

相关内容