При попытке удалить скрытые каталоги с помощью команды find кажется, что "удалить" скрытые файлы в верхнем каталоге? - PullRequest
1 голос
/ 06 января 2012

В приведенном ниже коде я ожидаю увидеть файлы find_examples_out / .t1, find_examples_out / .t2 и find_examples_out / .s1, напечатанные командой find, но по какой-то причине они исключены.Они появляются в подкаталогах просто отлично.

Тестовый скрипт:

#!/bin/csh 
# GNU find version 4.1.20

find -version
mkdir find_examples_out
cd find_examples_out
set FILES = (t1 .t1 t2 .t2 s1 .s1)
set DIRS  = (.hidden normal notnormal another)

foreach f ( $FILES )
   touch $f
end

foreach i ( $DIRS )
   mkdir $i
   cd $i
   foreach f ( $FILES )
      touch $f
   end
   cd ..
end
echo "Files present:"
ls -AR

echo
echo "Give me all files but exclude some paths:"
find .                     \
   \(                      \
      -path "\.?.*"        \
      -o -path "*normal*"  \
   \)                      \
   -prune                  \
   -o                      \
                           \
   \(                      \
      -type f              \
   \)                      \
   -print

cd ..
rm -rf find_examples_out

Вот вывод:

GNU find version 4.1.20
 Files present:
.:
another  .hidden  normal  notnormal  s1  .s1  t1  .t1  t2  .t2

./another:
s1  .s1  t1  .t1  t2  .t2

./.hidden:
s1  .s1  t1  .t1  t2  .t2

./normal:
s1  .s1  t1  .t1  t2  .t2

./notnormal:
s1  .s1  t1  .t1  t2  .t2

Give me all files but exclude some paths:
./t1
./t2
./s1
./another/t1
./another/.t1
./another/t2
./another/.t2
./another/s1
./another/.s1

Чего мне здесь не хватает?

1 Ответ

1 голос
/ 10 января 2012

Если я ничего не пропустил, ключ -path для поиска сравнивает шаблон, заданный пути , включая имя файла .

Ergo, ваш -path "\.?. *" будет соответствовать скрытым файлам ".t1" и т. Д.

FWIW: в версии find, которую я имею (v4.4.2), аргумент -path является шаблоном оболочки, а не регулярным выражением. Однако я использую bash и никогда не использовал csh, так что, возможно, это тоже имеет значение.

РЕДАКТИРОВАТЬ: я пытался добавить это в качестве комментария, но он продолжает разрушать форматирование.

Вы можете использовать это для достижения того, чего (я думаю) вы пытаетесь достичь:

find . \( \( -path "\.?.*" -type d \) -o -path "*normal*" \) -prune -o \( -type f \) -print
...