Вот полный скрипт (Я назвал его find-double-names.sh
), который находит все имена файлов, которые встречаются более одного раза. Если вы делаете это для очистки, помните, что файлы с одинаковыми именами могут иметь разное содержимое.
. чтобы найти все двойные имена файлов в вашем домашнем каталоге, запустите его следующим образом:
find-double-names.sh $HOME
Вы можете передать больше каталогов для включения в поиск, например.:
find-double-names.sh $HOME /usr/local /var/tmp
Очевидно, что при наличии большого количества файлов выполнение этого сценария может занять некоторое время, а также потребуется некоторое место на диске в /tmp.
#!/bin/bash
# This is the name of this script itself.
#
script="${0##*/}"
# The arguments passed to this script are the parent
# directories to be searched, e.g: /home/me /usr/local
# Check if any given. If not, error out.
#
if [ -z "$1" ] ; then
echo "Usage: $script <directory> [<directory>][...]" >&2
exit 1
fi
# Create a temporary directory. For accurate results we need
# to be sure it is empty. This is one way to do this: create
# an temp dir that is garanteed to not exist yet.
#
# If you want to keep the "outputdir" with the results, make sure
# output dir you use does not contain files you want to keep, because
# files will be removed from it by this script! Better yet, make
# sure it is empty before starting this script.
#
outputdir=$(mktemp --tmpdir -d "${script}.XXXXXXXXXX") # ensures new unique directory
trap "rm -r $outputdir" INT HUP QUIT ABRT ALRM TERM EXIT # ensures it is deleted when script ends
# Search the directories given as arguments, and process
# the paths of alle files one by one in a loop.
#
find "$@" -type f | while read path ; do
filename="${path##*/}"
echo "$path" >>"${outputdir}/${filename}.txt"
done
# Finally, if you want to end up with only file names that
# occur more than once, delete all output files that contain
# only one line.
#
for outputfile in $outputdir/*.txt ; do
linecount=$(wc -l "$outputfile" | sed 's/.*//') # count lines in it
if [ "$linecount" = "1" ] ; then # if only one line
rm "$outputfile" # remove the file
fi
done
# Print the final result
#
for outputfile in $outputdir/*.txt ; do
cat "$outputfile"
echo # empty line to separate groups of same file names
done
В течение многих лет я занимался своими личными установками TexLive с~/.bashrc
(и друзьями ).
В конце моего ~/.bashrc
у меня есть:
# User specific aliases and functions
if [ -f ${HOME}/.bashrc.${USER} ]; then
. ${HOME}/.bashrc.${USER}
fi
и в моем ~/.bashrc.rick
у меня есть (в дополнение к множеству других вещей):
export PATH=/home/rick/texlive/2020/bin/x86_64-linux:${PATH}
export MANPATH=/home/rick/texlive/2020/texmf-dist/doc/man:${MANPATH}
export INFOPATH=/home/rick/texlive/2020/texmf-dist/doc/info:${INFOPATH}
Каждый год я обновляю установку TexLive и экспортированные пути. Это сработало для меня очень хорошо.
Я чувствую, что есть несколько возможных исправлений для решения этой проблемы, но тот, который сработал для меня (и, следовательно, единственный, который я пробовал ), заключался в том, чтобы включить эту информацию PATH не в.profile (, как у меня ), а скорее в профиле.bash _. В противном случае существование профиля.bash _в основном заменит.profile, и ничего не изменится. (Я мог бы также указать профиль.bash _, чтобы использовать информацию из.profile.)
Кроме того, кажется, что я мог бы удалить.bash _, профиль (и, возможно, несколько других файлов.bash *), но я решил не идти по этому пути.