我写过这个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
但有没有办法更简单地编写这个脚本?
答案 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