Adicione um echo
antes do cp
e você verá que está fazendo
cp new/test1 new
cp test1 new
Isso porque find
não procura apenas no diretório atual, mas em todos os subdiretórios.
Alternativas:
Diga find
para não procurar em subdiretórios:
find /var/www/import -maxdepth 1 \
-iname 'test*' -newer timestamp -exec cp {} new \;
Diga a find
para ignorar o subdiretório new
:
find /var/www/import -type d -name new -prune -o \
-iname 'test*' -newer timestamp -exec cp {} new \;
Copie os arquivos para um diretório fora de /var/www/import
:
find /var/www/import \
-iname 'test*' -newer timestamp -exec cp {} /var/www/import.new \;
Mas se você tiver subdiretórios, acabará perdendo arquivos com os mesmos nomes.
por exemplo. se você tiver
test0
test1
scripts/test1
você acabará com
test0
test1
new/test1
scripts/test1
qual test1
foi copiado para new
?
Existem algumas maneiras de lidar com isso, mas a maneira mais fácil e eficiente de usar é usar cp --parents
cd /var/www/import
find . -type d -name new -prune -o \
-type f -iname 'test*' -newer timestamp -exec cp --parents {} new \;
que lhe dará
test0
test1
new/test1
new/scripts/test1
scripts/test1
O Rush já respondeu à segunda parte da sua pergunta, por isso não vou repeti-lo.