在一个目录中查找不在另一个目录中的文件

时间:2011-05-17 14:58:11

标签: linux bash find

我写过这个bash脚本:

#!/bin/bash
DIR_TORRENTS="/home/simon/.wine/drive_c/users/simon/Datos de programa/uTorrent"
DIR_DESCARGA=/home/simon/torrent-descargas/
DIR_TEMPORAL=/home/simon/torrent-temporal/
cd "$DIR_TORRENTS"
rm -f /tmp/torrent_existentes
for torrent in *.torrent
do
    nombre=`basename "$torrent" .torrent`
    find "$DIR_TEMPORAL" "$DIR_DESCARGA" -maxdepth 2 -name "$nombre" -printf '%f.torrent\n' >> /tmp/torrent_existentes
done

使用此脚本,我想获取一些torrent文件列表,其中的数据仍然存在于 uTorrent 的数据文件夹中。
该脚本有效,除非文件名包含某些字符,如“[]”。我认为问题在于“-name”将“$nombre”解释为模式。如何禁用此行为?


好吧,我找到了解决方法:nombre=$(basename "$torrent" .torrent | sed 's/\[/\\[/g; s/\]/\\]/g')

但现在我有另一个问题。我想删除 uTorrent 数据文件夹中不存在数据的torrent文件 我修改了我以前的脚本(这个脚本不会删除任何内容,因为我先测试):

#!/bin/bash

DIR_TORRENTS="/home/simon/.wine/drive_c/users/simon/Datos de programa/uTorrent"
DIR_DESCARGA=/home/simon/torrent-descargas/
DIR_TEMPORAL=/home/simon/torrent-temporal/

cd "$DIR_TORRENTS"
for torrent in *.torrent
do
    nombre=$(basename "$torrent" .torrent | sed 's/\[/\\[/g; s/\]/\\]/g')
    if ! find "$DIR_TEMPORAL" "$DIR_DESCARGA" -maxdepth 2 -name "$nombre" &> /dev/null 
    then
        echo "$torrent"
    fi
done

但它没有打印,为什么?


嗯,这也解决了:

#!/bin/bash

DIR_TORRENTS="/home/simon/.wine/drive_c/users/simon/Datos de programa/uTorrent"
DIR_DESCARGA=/home/simon/torrent-descargas/
DIR_TEMPORAL=/home/simon/torrent-temporal/

rm -f /tmp/torrent_existentes
cd "$DIR_TORRENTS"
for torrent in *.torrent
do
    nombre=$(basename "$torrent" .torrent | sed 's/\[/\\[/g; s/\]/\\]/g')
    find "$DIR_TEMPORAL" "$DIR_DESCARGA" -maxdepth 2 -name "$nombre" -printf '%f.torrent\n' >> /tmp/torrent_existentes
done
for torrent in *.torrent
do
    if ! grep -Fq "$torrent" /tmp/torrent_existentes 
    then
        rm "$torrent"
    fi
done

但有没有办法更简单地编写这个脚本?

2 个答案:

答案 0 :(得分:0)

你需要逃脱nombre:

nombre='abc[def]ghi'
printf -v escaped_nombre "%q" "$nombre"
echo $escaped_nombre

答案 1 :(得分:0)

你有没有尝试过这种方式:

comm -1 -2 <(cd $DIR_1; find . | sort) <(cd $DIR_2; find . | sort)

这将输出两个目录共有的文件列表。您可能仍需要截断每行前缀的“./”,但是当您获得公共文件列表时,这很容易实现。

编辑: 如果您只需要 目录中的文件,请将-1 -2替换为:

  • -1 -3 ==&gt;仅查找$ DIR_2
  • 中的文件
  • -2 -3 ==&gt;仅查找$ DIR_1
  • 中的文件