Как скопировать заголовок файлов в другую папку, сохранив древовидную структуру?
У меня есть куча огромных файлов (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/{}" \;