Это решение найдет дубликаты за время O(n). Для каждого файла генерируется контрольная сумма, и каждый файл, в свою очередь, сравнивается с набором известных контрольных сумм через ассоциативный массив.
#!/bin/bash
#
# Usage: ./delete-duplicates.sh [<files...>]
#
declare -A filecksums
# No args, use files in current directory
test 0 -eq $# && set -- *
for file in "$@"
do
# Files only (also no symlinks)
[[ -f "$file" ]] && [[ ! -h "$file" ]] || continue
# Generate the checksum
cksum=$(cksum <"$file" | tr ' ' _)
# Have we already got this one?
if [[ -n "${filecksums[$cksum]}" ]] && [[ "${filecksums[$cksum]}" != "$file" ]]
then
echo "Found '$file' is a duplicate of '${filecksums[$cksum]}'" >&2
echo rm -f "$file"
else
filecksums[$cksum]="$file"
fi
done
Если вы не укажете какие-либо файлы (или подстановочные знаки) в командной строке, будет использоваться набор файлов в текущем каталоге. Он будет сравнивать файлы в нескольких каталогах, но не написан для рекурсии в сами каталоги.
«Первый» файл в наборе всегда считается окончательной версией. Не принимается во внимание время файла, разрешения или права собственности. Учитывается только содержание.
Удалите echo
из строки rm -f "$file"
, если вы уверены, что это делает то, что вы хотите. Обратите внимание: если вы замените эту строку на ln -f "${filecksums[$cksum]}" "$file"
, вы можете жестко связать контент. Та же экономия места на диске, но вы не потеряете имена файлов.
Si ingresa ksh script_name
, ejecutará ksh
con el argumento script_name
. Eso significa que será ejecutado por ksh. El shebang solo importa cuando se ejecuta el script explícitamente (, p../script_name
).
Respuesta corta:ksh ejecutará el script y tratará #!/bin/bash
como un comentario.
Explicación:cada vez que se llama a cualquier ejecutable para que se ejecute, bash o cualquier llamada de shell exec()
llamada al sistema
exec()
carga el archivo y verifica los primeros 16 bits del archivo para ver qué formato ejecutable tiene. Si encuentra #!, utiliza el resto de la primera línea del archivo para encontrar qué programa debe iniciar y proporciona el nombre del archivo que intentaba iniciar (el script )como último argumento para el programa intérprete.
y así es como el intérprete especificado en shebang ejecuta el script
pero cuando ya especificó ksh y proporcionó el argumento, exec no buscará shebang pero Shell encontrará el binario de la variable $PATH
para cargar el binario y le dará el nombre del archivo como argumento al binario.