#!/bin/bash
# cmp_dir - program to compare two directories
# Check for required arguments
if [ $# -ne 2 ]; then
echo "usage: $0 directory_1 directory_2" 1>&2
exit 1
fi
# Make sure both arguments are directories
if [ ! -d "$1" ]; then
echo "$1 is not a directory!" 1>&2
exit 1
fi
if [ ! -d "$2" ]; then
echo "$2 is not a directory!" 1>&2
exit 1
fi
# Process each file in directory_1, comparing it to directory_2
missing=0
while IFS= read -r -d $'while IFS= read -r -d $'while IFS= read -r -d $'#!/bin/bash
# cmp_dir - program to compare two directories
# Check for required arguments
if [ $# -ne 2 ]; then
echo "usage: $0 directory_1 directory_2" 1>&2
exit 1
fi
# Make sure both arguments are directories
if [ ! -d "$1" ]; then
echo "$1 is not a directory!" 1>&2
exit 1
fi
if [ ! -d "$2" ]; then
echo "$2 is not a directory!" 1>&2
exit 1
fi
# Process each file in directory_1, comparing it to directory_2
missing=0
while IFS= read -r -d $'while IFS= read -r -d $'while IFS= read -r -d $'%pre%' filename
do
fn=$(basename "$filename")
if ! find "$2" -name "$fn" | grep -q . ; then
echo "$fn is missing from $2"
missing=$((missing + 1))
fi
done < <(find "$1" -type f -print0)
' filename
do
fn=${filename#$1}
if [ ! -f "$2/$fn" ]; then
echo "$fn is missing from $2"
missing=$((missing + 1))
fi
done < <(find "$1" -type f -print0)
' filename
do
fn=${filename#$1}
if [ ! -f "$2/$fn" ]; then
echo "$fn is missing from $2"
missing=$((missing + 1))
fi
done < <(find "$1" -type f -print0)
echo "$missing files missing"
' filename
do
fn=$(basename "$filename")
if ! find "$2" -name "$fn" | grep -q . ; then
echo "$fn is missing from $2"
missing=$((missing + 1))
fi
done < <(find "$1" -type f -print0)
' filename
do
fn=${filename#$1}
if [ ! -f "$2/$fn" ]; then
echo "$fn is missing from $2"
missing=$((missing + 1))
fi
done < <(find "$1" -type f -print0)
' filename
do
fn=${filename#$1}
if [ ! -f "$2/$fn" ]; then
echo "$fn is missing from $2"
missing=$((missing + 1))
fi
done < <(find "$1" -type f -print0)
echo "$missing files missing"
Observe que adicionei aspas duplas em torno de $1
e $2
em vários locais acima para protegê-las da expansão do shell. Sem as aspas duplas, os nomes de diretório com espaços ou outros caracteres difíceis causariam erros.
O loop de chaves agora é:
%pre% Isso usa find
para mergulhar recursivamente no diretório $1
e localizar nomes de arquivos. A construção while IFS= read -r -d $'
é segura contra todos os nomes de arquivos. basename
' filename; do .... done < <(find "$1" -type f -print0)
basename
não é mais usado porque estamos vendo arquivos em subdiretórios e precisamos manter os subdiretórios. Portanto, no lugar da chamada para fn=${filename#$1}
, a linha filename
é usada. Isso apenas remove de $1
o prefixo que contém o diretório a/b/c/some.txt
.
Problema 2
Suponha que correspondamos os arquivos por nome, mas independentemente do diretório. Em outras palavras, se o primeiro diretório contiver um arquivo some.txt
, nós o consideraremos presente no segundo diretório se o arquivo %code% existir em qualquer subdiretório do segundo diretório. Para fazer isso, substitua o loop acima por: