我正在尝试编写一个脚本,该脚本列出目录中的文件,然后逐个搜索其他目录中的每个文件。为了处理空格和特殊字符,如“[”或“]”,我将$(printf %q "$FILENAME")
其用作 find 命令的输入:find /directory/to/search -type f -name $(printf %q "$FILENAME")
. 它对每个文件名都像一个魅力,除了在一种情况下:当有多字节字符(UTF-8)时。在这种情况下,printf 的输出是一个外部引用的字符串,即:$'文件名,带有空格和 \NNN\NNN' 形式的引用字符,并且如果没有 $'' 引用,该字符串不会被扩展,所以find 搜索名称包含该引号的文件:«$'filename'»。
是否有替代解决方案可以通过查找任何类型的文件名?
我的脚本如下(我知道有些行可以删除,比如“RESNAME=”):
#!/bin/bash
if [ -d $1 ] && [ -d $2 ]; then
IFSS=$IFS
IFS=$'\n'
FILES=$(find $1 -type f )
for FILE in $FILES; do
BASEFILE=$(printf '%q' "$(basename "$FILE")")
RES=$(find $2 -type f -name "$BASEFILE" -print )
if [ ${#RES} -gt 1 ]; then
RESNAME=$(printf '%q' "$(basename "$RES")")
else
RESNAME=
fi
if [ "$RESNAME" != "$BASEFILE" ]; then
echo "FILE NOT FOUND: $FILE"
fi
done
else
echo "Directories do not exist"
fi
IFS=$IFSS
正如答案所说,我使用了关联数组,但没有运气,也许我没有正确使用数组,但回显它 (array[@]) 什么也不返回。这是我写的脚本:
#!/bin/bash
if [ -d "$1" ] && [ -d "$2" ]; then
declare -A files
find "$2" -type f -print0 | while read -r -d $'\0' FILE;
do
BN2="$(basename "$FILE")"
files["$BN2"]="$BN2"
done
echo "${files[@]}"
find "$1" -type f -print0 | while read -r -d $'\0' FILE;
do
BN1="$(basename "$FILE")"
if [ "${files["$BN1"]}" != "$BN1" ]; then
echo "File not found: "$BN1""
fi
done
fi