2011-05-17 2 views
1

директорий, которые я написал этот Баш скрипт:Поиск файлов в одной директории, которая не в другом

#!/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 

С помощью этого скрипта я хочу, чтобы получить список торрент-файлы, данные по-прежнему существует в папках данных uTorrent.
Скрипт работает, за исключением случаев, когда имя файла имеет некоторые символы, такие как «[]». Я думаю, проблема заключается в том, что «-name« интерпретирует »$nombre« как шаблон. Как я могу отключить это поведение?


Ну, я нашел решение этой: nombre=$(basename "$torrent" .torrent | sed 's/\[/\\[/g; s/\]/\\]/g')

Но теперь у меня есть еще одна проблема. Я хочу удалить торрент-файлы, данные которых отсутствуют в папках с данными uTorrent.
Я изменил мой предыдущий сценарий (этот сценарий не удаляет ничего, потому что я тестирую первый):

#!/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

try '... -name $ (quote" $ nombre ") ...' –

+0

Спасибо, но это не сработает. –

ответ

0

Вам нужно бежать Номбр:

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

Спасибо, но эта команда сбрасывает все символы, и это вызывает то, что find тоже не удается. –

+0

@ Simón - Знаете ли вы, какие символы нужно ускользать? – linuts

+0

да, эта проблема решена (_see мой отредактированный вопрос_) –

0

Пытались ли вы это так:

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

Этот выход список файлов, общих для обоих каталогов. Возможно, вам все равно нужно усечь «./» с префиксом каждой строки, но это легко выполнимо, если у вас есть список обычных файлов.

Edit: Если вам нужны файлы, находящиеся только в либо каталог, замените -1 -2 с:

  • -1 -3 ==> найти только файлы в $ DIR_2
  • -2 -3 ==> найти только файлы в $ DIR_1
+0

Смотрите сценарий. Поиск выполняется в нескольких папках одновременно. Существует 3 папки, и одна из папок имеет несколько подпапок. –

+0

@ Simón ahhh ... после повторного чтения сценария несколько раз, я, наконец, понимаю. Там есть «умные» способы делать то, что вы хотите, но ваш путь легче понять. Через несколько недель «более умный» способ больше не имеет смысла для вас.Поэтому я предлагаю придерживаться вашего решения. – pepoluan

Смежные вопросы