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

381
user2986

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

Я пробовал:

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

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

2
Учитывая, что OSX 10.7 еще не выпущен публично - вы можете подумать о том, чтобы сказать, что вы находитесь на OSX в строке вопроса, чтобы люди, не работающие на 10.7, не игнорировали вопрос из-за того, что никогда не использовали его раньше. James T Snell 12 лет назад 0
Он помечен Snow Leopard, но это версия 10.6. Вы имеете в виду еще не выпущенный Lion 10.7 или Snow Leopard 10.6? Noel M 12 лет назад 0
Я имел ввиду 10.6.7, я для простоты поменял его на снежного барса. Благодарю. user2986 12 лет назад 0
Я только что полностью удалил версию, это не имеет большого значения. slhck 12 лет назад 0

2 ответа на вопрос

1
slhck

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

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

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

Черт! Я едва опоздал. bahamat 12 лет назад 0
1
bahamat

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

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