Скопируйте все файлы в папке в другую папку, предварительно добавив. в имя файла и переименуйте его обратно в исходное имя файла - PullRequest
0 голосов
/ 16 января 2020

после поиска и попыток каким-либо другим способом я не смог заставить его работать.

Мне нужно скопировать множество файлов (более 100 тысяч файлов) в другую папку с точкой перед именем файла Пример:

/ foo / bar / filename1.txt в /foo2/bar/.filename1.txt

, а затем переименуйте его в исходное имя /foo2/bar/filename.txt

Почему мне нужно это сделать, потому что у меня есть приложение, которое будет сканировать папку / foo2 / bar и ее подпапку и игнорировать этот файл с точкой перед именем файла, чтобы оно не обрабатывало копируемый файл на полпути. Это в основном потому, что папка 2 может находиться на двух разных сетевых дисках или на некоторых подключенных устройствах.

И я не могу просто использовать mv или cp, потому что у меня есть папка, в которой слишком много файлов, и она просто выдаст список аргументов тоже длинная ошибка, поэтому я пытался использовать команду поиска, но безрезультатно.

Попытка с другой командой:

find /foo/bar/ -type f -exec cp -t /foo2/bar {} +

и

find /foo/bar/ -type f -exec mv {} /foo2/bar/.{} \;

Я знаю Команда выше не будет делать то, что я хотел, но это то, что я устал.

Цените любого, кто может помочь ...

Ответы [ 3 ]

1 голос
/ 16 января 2020

Предположим, у нас есть два каталога следующим образом:

$ ls -a foo*
foo1:
 .   ..   file1   file2   file3  'file 4'

foo2:
.  ..

Если мы выполним следующую команду:

$ for file in foo1/* ; do base=$(basename "$file"); cp "foo1/$base" "foo2/.$base"; mv "foo2/.$base" "foo2/$base"; done

Мы получим в конце:

$ ls -a foo*
foo1:
.  ..   file1   file2   file3  'file 4'

foo2:
.   ..   file1   file2   file3  'file 4'

Я думаю, это то, что вы хотели.

Более того, имена файлов с пробелами внутри будут правильно обрабатываться.

0 голосов
/ 16 января 2020

Не могли бы вы попробовать следующее:

src="/foo/bar"
dest=/foo2/bar"
while IFS= read -r -d "" f; do
    cp -p -- "$src/$f" "$dest/.$f"
    mv -- "$dest/.$f" "$dest/$f"
done < <(find "$src" -type f -printf "%f\0")

-printf "%f\0" в основном аналогично -print0, за исключением того, что оно удаляет имя каталога.

0 голосов
/ 16 января 2020

Скопировать все файлы в новый каталог с новым именем:

for file in *; do   cp "$file" "./files2//.${file}"; done

$ ls -la ./files2/
total 4
 .
 ..
 .1
 .2
 .3

Переименовать файлы:

cd files2
rename . "" .*

Вывод:

$ ls -la 
total 4
 .
 ..
 1
 2
 3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...