Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 运行脚本以检查重复文件-安装失败_Bash_Loops_Directory - Fatal编程技术网

Bash 运行脚本以检查重复文件-安装失败

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

所以我有一个脚本,它检查一个输入文件夹中是否有重复的文件…但由于某种原因它不起作用,它真的开始让我感到沮丧…从我在网上看到的情况来看,语法似乎是正确的

它只是不能正常循环-因为回音只输入一次,但是我正在测试的文件夹中有3个文件。我尝试将第4行中的$FOLDER位更改为实际名称,如/stuff/*和stuff/*以及stuff 我正在测试的文件夹的名称。有什么想法吗

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