您将如何遍历目录中的文件并将它们相互比较?
How would you loop through files in a directory and compare them to each other?
我从不编写 bash 脚本,所以我不知道如何以最有效的方式快速完成此操作。我知道我会如何用 python 或 c++ 之类的东西来做。
我的文件结构如下所示:
-parentDir
--subDir1
---file1.txt
---file2.txt
---file3.txt
---file4.txt
--subDir2
---file1.txt
---file2.txt
---file3.txt
---file4.txt
可以有任意数量的子目录和文本文件。
基本上我想创建一个 bash 脚本进入每个子目录,然后使用 file1.txt
和 file2.txt
使用 diff 进行比较,然后比较 file2.txt
和 file3.txt
等等将差异输出到一个txt文件的末尾。
我知道如何使用 diff 比较文件,然后将差异输出到 txt 文件我只是不知道如何执行我设想的双重 for 循环。
有什么想法吗?
#!/usr/bin/env bash
typeset -r diffs=diffs.txt
typeset -a allfiles=()
typeset -- filename=''
# fills the allfiles array with all *.txt files except the diffs.txt
# that can be found from the current directory and down all sub-directories
while IFS= read -r -d '' filename; do
allfiles+=("$filename")
done < <(
find . -type f -name '*.txt' -and -not -name "$diffs" -print0 2>/dev/null
)
[[ ${#allfiles[@]} -lt 2 ]] && exit 2 # Need at least 2 files to compare
typeset -i i=0 j=0
typeset -- file_a='' file_b=''
export LC_MESSAGES=POSIX
# for all files except last
for ((i = 0; i < ${#allfiles[@]} - 1; i++)); do
file_a="${allfiles[$i]}"
# for next file to last file
for ((j = i + 1; j < ${#allfiles[@]}; j++)); do
file_b="${allfiles[$j]}"
diff --report-identical-files --unified=0 --minimal -- \
"$file_a" "$file_b" 2>/dev/null
echo
done
done >"$diffs" # all output to the diffs file
我从不编写 bash 脚本,所以我不知道如何以最有效的方式快速完成此操作。我知道我会如何用 python 或 c++ 之类的东西来做。
我的文件结构如下所示:
-parentDir
--subDir1
---file1.txt
---file2.txt
---file3.txt
---file4.txt
--subDir2
---file1.txt
---file2.txt
---file3.txt
---file4.txt
可以有任意数量的子目录和文本文件。
基本上我想创建一个 bash 脚本进入每个子目录,然后使用 file1.txt
和 file2.txt
使用 diff 进行比较,然后比较 file2.txt
和 file3.txt
等等将差异输出到一个txt文件的末尾。
我知道如何使用 diff 比较文件,然后将差异输出到 txt 文件我只是不知道如何执行我设想的双重 for 循环。
有什么想法吗?
#!/usr/bin/env bash
typeset -r diffs=diffs.txt
typeset -a allfiles=()
typeset -- filename=''
# fills the allfiles array with all *.txt files except the diffs.txt
# that can be found from the current directory and down all sub-directories
while IFS= read -r -d '' filename; do
allfiles+=("$filename")
done < <(
find . -type f -name '*.txt' -and -not -name "$diffs" -print0 2>/dev/null
)
[[ ${#allfiles[@]} -lt 2 ]] && exit 2 # Need at least 2 files to compare
typeset -i i=0 j=0
typeset -- file_a='' file_b=''
export LC_MESSAGES=POSIX
# for all files except last
for ((i = 0; i < ${#allfiles[@]} - 1; i++)); do
file_a="${allfiles[$i]}"
# for next file to last file
for ((j = i + 1; j < ${#allfiles[@]}; j++)); do
file_b="${allfiles[$j]}"
diff --report-identical-files --unified=0 --minimal -- \
"$file_a" "$file_b" 2>/dev/null
echo
done
done >"$diffs" # all output to the diffs file