2016-12-17 9 views
0

Глобальный коммутатор '-depth' документирован как принудительный поиск по глубине, но даже без этого переключателя я, кажется, получаю поиск по глубине, и это не то, что я хочу. В частности, я хочу, чтобы он выводил соответствующий файл в каталог до, он переписывается в подкаталоги.Как я могу найти GNU 'find' для поиска * первого экземпляра имени файла в дереве каталогов?

Примечание: в этом примере он находит 12/KeyboardTest/Main.jack до находит 12/Keyboard.jack.

$ find . -name "*.jack" 
./12/KeyboardTest/Main.jack 
./12/Keyboard.jack 
./12/Math.jack 
./12/Screen.jack 
./12/String.jack 
./12/Output.jack 
./12/Memory.jack 
./12/MemoryTest/Main.jack 
./12/Sys.jack 
./12/ArrayTest/Main.jack 
./12/SysTest/Main.jack 
./12/ScreenTest/Main.jack 
./12/OutputTest/Main.jack 
./12/StringTest/Main.jack 
./12/MathTest/Main.jack 
./12/Array.jack 

(я случайно делать это под Cygwin, я не думает, релевантные, но я упоминаю его в случае, если она есть.)

Я мог бы, конечно, написать свой собственный Баш или Perl код для этого, но это кажется ... чрезмерным? Я просто должен упускать из виду способ найти находку для этого.

+0

Stack Overflow - это сайт для вопросов программирования и разработки. Этот вопрос кажется вне темы, потому что речь идет не о программировании или разработке. См. [Какие темы можно задать здесь] (http://stackoverflow.com/help/on-topic) в Справочном центре. Возможно, лучше сказать [Суперпользователь] (http://superuser.com/) или [Unix & Linux Stack Exchange] (http://unix.stackexchange.com/). Также см. [Где я пишу вопросы о Dev Ops?] (Http://meta.stackexchange.com/q/134306) – jww

ответ

0

Параметр -depth позволяет найти содержимое каталога перед самим каталогом. Содержимое каталога всего в каталоге, будь то файл или каталог. Это разница между:

foo 
foo/file1 
foo/dir 
foo/dir/file 
foo/file2 

и:

foo/file1 
foo/dir/file 
foo/dir 
foo/file2 
foo 

foo был до против после того, как элементы в foo, в то время как порядок этих пунктов, file1, file2 и dir, остается неизменным.

найти не сортирует, поэтому не сможет просто использовать find, чтобы делать то, что вы хотите. Что-то, что следует за украшением, сортировкой, не украшением шаблона, может сработать для вас. Рассмотрим префикс каждого элемента с его глубиной через -printf "%d %p\n", а затем вывести вывод для сортировки -n. Из моего списка выше мы получим:

$ find foo -name "file*" -printf "%d %p\n" | sort -n 
1 foo/file1 
1 foo/file2 
2 foo/dir/file 

Это похоже на заказ. Разделите номер глубины на «cut» или «awk», и у вас есть свой список. Поместите его в xargs, если вы хотите запустить команду в этих файлах, а не просто перечислить их.

На трех уровнях, вы можете не найти порядок сортировки, чтобы быть тем, что вы имели в виду, хотя оно удовлетворяет вашим заявленным требованиям.

1 foo/file1 
2 foo/dir1/file 
2 foo/dir2/file 
3 foo/dir1/subdir/file 

Возможно, вы действительно хотели, чтобы эти последние две строки были в обратном порядке. Это будет сложнее!