2

У меня есть куча огромных файлов (4 ГБ + каждый) с одинаковым расширением в структуре каталогов на сетевом диске, но меня интересуют только первые несколько байтов каждого, поэтому я хотел бы скопировать их все на свой локальный диск, с одинаковыми именами файлов и поддержанием той же структуры папок.

Я пробовал:

$ find . -type d -exec mkdir -p ~/Desktop/heads/{} \;
$ find . -type f -name "*.ext" -exec head -c 128 {} > ~/Desktop/heads/{} \;

Но это не работает, так как все они помещаются в файл с именем «{}», возможно потому, что оператор «>» не интерпретируется как часть аргумента -exec, и если я экранирую его с помощью «\>» , затем он экранируется до аргумента head, который тоже не работает.

2 ответа2

1

Вы правильно заметили, что проблема в > перенаправлении. Два решения:

Либо используйте что-то вроде этого:

find . -type f -name "*.ext" -exec sh -c "head -c 128 '{}' > ~/Desktop/heads/'{}'" \;

Или вы также можете передать '{}' в качестве аргумента подоболочке:

find . -type f -name "*.ext" -exec sh -c 'head -c 128 $1 > ~/Desktop/heads/$1' -- {} \;

Последний работает, потому что -- {} передает имя файла в качестве аргумента sh -c , к которому может получить доступ $1 . Обратите внимание , что вы теперь должны использовать одинарные кавычки ' , а двойные кавычки.


Обновление: я на самом деле нашел вопрос переполнения стека, который охватывает вашу основную проблему, а именно использование > внутри xargs или аналогичных команд:

Как использовать> в команде xargs?

Я хочу найти команду bash, которая позволит мне grep каждый файл в каталоге и записать вывод этого grep в отдельный файл. [...]

1

Ваш редирект ломает это. Изменить на это:

$ find . -type d -exec mkdir -p ~/Desktop/heads/{}
$ find . -type f -name "*.ext" -exec sh -c "head -c 128 {} > ~/Desktop/heads/{}" \;

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .