ディレクトリ上のファイルを一覧表示し、他のディレクトリ内のすべてのファイルを 1 つずつ検索するスクリプトを実行しようとしています。スペースや「[」や「]」などの特殊文字を処理$(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