for循环中的find命令不会列出所有文件

时间:2018-07-18 22:14:17

标签: bash macos variables for-loop find

我制作了一个脚本,该脚本列出了当前目录和子目录中的每个文件,并向我提供了该文件的开头和结尾(带有偏移量)的md5sum,并将其保存为.txt文件。

我使用管道进行了此操作,因此我无法重定向之前由userinput声明的变量。所以我将脚本更改为for循环。 现在出现问题:它不会列出所有文件,而只会列出一个。它似乎是随机执行的。为什么不像以前一样列出所有文件?

我什至尝试了**。*和./*等。我使用的是macbookpro mac os 10.13.6。我曾经安装过一些东西,所以我也可以使用linux命令,例如tree等。

感谢您的帮助!我不知道我能做什么。

未重定向变量的旧代码:

#!/bin/bash

echo Wie heißt die Festplatte?
read varname
echo Los gehts! 

before=$(date +%s)

find . \( ! -regex '.*/\..*' \) -type f -exec bash -c 'h=`tail -n +50000 "{}" | head -c 1000 | md5`;\
             t=`tail -c 51000 "{}" | head -c 1000 | md5`;\
             echo "$varname {} ; $h ; $t"' \;> /Users/Tobias/Desktop/$varname.txt

after=$(date +%s)

echo Das hat: $(((after - $before)/60)) Minuten bzw $(((after - $before))) Sekunden gedauert

新代码,其中未列出所有文件,仅列出了一个文件:

#!/bin/bash

echo Wie heißt die Festplatte?
read varname
echo Los gehts! 

before=$(date +%s)

for i in $( find . \( ! -regex '.*/\..*' \) -type f ); do
h=$(tail -n +50000 $i | head -c 1000 | md5)
t=$(tail -c 51000 $i | head -c 1000 | md5)
echo "$varname; $i ; $h ; $t" > /Users/Tobias/Desktop/$varname.txt
done 

after=$(date +%s)

echo Das hat: $(((after - $before)/60)) Minuten bzw $(((after - $before))) Sekunden gedauert

2 个答案:

答案 0 :(得分:0)

您将在循环的每次迭代中覆盖文件。改用追加模式:

echo "$varname; $i ; $h ; $t" >> /Users/Tobias/Desktop/"$varname".txt
#                             ~~

或重定向整个循环的输出:

    echo "$varname; $i ; $h ; $t"
done  > /Users/Tobias/Desktop/"$varname".txt

答案 1 :(得分:0)

重定向整个循环的输出,而不是重定向每次都会覆盖文件的每个echo语句。

for i in $( find . \( ! -regex '.*/\..*' \) -type f ); do
    h=$(tail -n +50000 $i | head -c 1000 | md5)
    t=$(tail -c 51000 $i | head -c 1000 | md5)
    echo "$varname; $i ; $h ; $t"
done > /Users/Tobias/Desktop/$varname.txt