Bash 运行脚本以检查重复文件-安装失败
所以我有一个脚本,它检查一个输入文件夹中是否有重复的文件…但由于某种原因它不起作用,它真的开始让我感到沮丧…从我在网上看到的情况来看,语法似乎是正确的 它只是不能正常循环-因为回音只输入一次,但是我正在测试的文件夹中有3个文件。我尝试将第4行中的$FOLDER位更改为实际名称,如/stuff/*和stuff/*以及stuff 我正在测试的文件夹的名称。有什么想法吗Bash 运行脚本以检查重复文件-安装失败,bash,loops,directory,Bash,Loops,Directory,所以我有一个脚本,它检查一个输入文件夹中是否有重复的文件…但由于某种原因它不起作用,它真的开始让我感到沮丧…从我在网上看到的情况来看,语法似乎是正确的 它只是不能正常循环-因为回音只输入一次,但是我正在测试的文件夹中有3个文件。我尝试将第4行中的$FOLDER位更改为实际名称,如/stuff/*和stuff/*以及stuff 我正在测试的文件夹的名称。有什么想法吗 FOLDER=$1 mkdir check for FILE in $FOLDER; do echo $FILE CHECKS
FOLDER=$1
mkdir check
for FILE in $FOLDER;
do
echo $FILE
CHECKSUM=$(cksum $FILE|awk '{print $1}')
if [[ -e check/$CHECKSUM ]];then
echo Duplicate at $FILE
rm $FILE
else
touch check/$CHECKSUM
echo "check/$CHECKSUM"
fi
您没有对文件进行路径名扩展。也许你想要:
for FILE in "$FOLDER"/*;
如果要以具有特定扩展名的文件为目标,请执行以下操作:
for FILE in "$FOLDER"/*.ext;
测试文件是否真的是文件而不是目录也是一件好事:
for FILE in "$FOLDER"/*; do
if [[ -f $FILE ]]; then
如果要递归处理文件,请使用while read循环代替find:
只使用fdupes如何?您在结尾缺少一个done。您不需要在…中的文件后面加分号。。。。如果任何文件的名称中有空格,则应将所有出现的$FILE用双引号括起来。
while IFS= read FILE; do
...
done < <(exec find "$FOLDER" -type f)
#!/bin/bash
# Published under GPLv3. Use at your own risk
# Script to search a folder for redundant files and delete duplicates
# Unix directive of no news is good news is followed
# Usage: <path-to-script> FOLDER [Folder] [...]
# To create a test folder containing files:
# mkdir -p duplicates;
# for foo in {1..5}; do dd if=/dev/zero of=duplicates/$foo bs=4K count=$foo; done;
# cp duplicates/4 duplicates/4-copy
declare -A FILE_CKSUMS;
for FOLDER_TO_CHECK;
do
[[ -d "${FOLDER_TO_CHECK}" ]] && [[ -w "${FOLDER_TO_CHECK}" ]] \
&&
{
unset 'FILE_CKSUMS[@]';
[[ "${FOLDER_TO_CHECK: -1}" != "/" ]] \
&& FOLDER_TO_CHECK="${FOLDER_TO_CHECK}/";
# Globbing through the folder content
for FILE_TO_CHECK in "${FOLDER_TO_CHECK}"*;
do
[[ -f "${FILE_TO_CHECK}" ]] && [[ -w "${FILE_TO_CHECK}" ]] \
&&
{
read -d ' ' FILE_CKSUM <<< `cksum "${FILE_TO_CHECK}"`;
[[ -n "${FILE_CKSUM}" ]] \
&&
{
[[ -n "${FILE_CKSUMS[${FILE_CKSUM}]}" ]] \
&&
{
# Deleting file here
rm "${FILE_TO_CHECK}" \
|| echo "Failed to delete file ${FILE_TO_CHECK}";
} \
||
{
FILE_CKSUMS["${FILE_CKSUM}"]="${FILE_TO_CHECK}";
}
}
}
done
}
done