for name in dir1/* dir2/*; do
bname=${name##*/}
if [ ! -e "dir1/$bname" ]; then
printf '"%s" not in dir1\n' "$bname"
elif [ ! -e "dir2/$bname" ]; then
printf '"%s" not in dir2\n' "$bname"
fi
done
Isso iterará todos os nomes em dir1
e dir2
. $bname
será o nome da base do nome ( $name
sem caminho).
Se o nome (base) não puder ser encontrado em dir1
, isso será relatado. Caso contrário, se não for encontrado em dir2
, será relatado.
Isso lida com nomes de arquivos que contêm novas linhas incorporadas e deve ser executado com /bin/sh
ou qualquer shell sh
compatível.
Isso poderia ser expandido para mais de dois diretórios. Com bash
:
dirs=( dir1 dir2 dir3 dir4 )
for dir in "${dirs[@]}"; do
for name in "$dir"/*; do
bname=${name##*/}
for tdir in "${dirs[@]}"; do
if [ ! -e "$tdir/$bname" ]; then
printf '"%s" not found in %s\n' "$bname" "$tdir"
fi
done
done
done
$ tree
.
|-- dir1
| '-- filename 1
|-- dir2
| |-- filename 1
| |-- filename 3
| '-- hello
world
'-- script.sh
$ sh script.sh
"filename 3" not in dir1
"hello
world" not in dir1