Как скопировать заголовок файлов в другую папку, сохранив древовидную структуру?

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

Я пробовал:

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

But it doesn't work, since they are all put in a file called '{}', probably because the '>' operator is not being interpreted as part of the -exec argument, and if I escape it with '\>', then it is escaped down to the head argument, which doesn't work either.

2 ответа

Решение

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

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

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 в отдельный файл. [...]

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

$ find . -type d -exec mkdir -p ~/Desktop/heads/{}
$ find . -type f -name "*.ext" -exec sh -c "head -c 128 {} > ~/Desktop/heads/{}" \;
Другие вопросы по тегам