Изучив проблему и придумав решение, которое я написал в первом ответе, я понял, что существует другой очень простой способ.
Просто начните с имен цели, которые вы не хотите показывать, начав с точки .
Пример:
.PHONY: foo .hiddentarget
foo: foo.x .hiddentarget
foo.x: foo.c
touch foo.x
.hiddentarget: foo.x
echo foo.x ok, I believe
И это все, что вам нужно!
Я пришел к этой идее после того, как попытался выяснить, как предотвратить вызов по ошибке цели с именем .HIDDENGOALS и запустить все скрытые цели.:)
Предупреждение Хотя я не вижу никакой, я не уверен, что нет никакого побочного эффекта на использование имен целей, таких как « .targetname »
-121--71800-Я собирался расширить свой первоначальный код, но он доходит до точки, где гораздо проще просто восстановить все в Perl напрямую:
#!/usr/bin/env perl
## This is the path to the target directories
my $path="/Users/Masi/Dropbox/";
## The target directories
my @directories=("Cardiology","Rheumatology","Surgery");
## Iterate over the directories
foreach my $dir (@directories) {
my $dd=0;
## Read the current directory
opendir (my $DIR, "$path/$dir");
## Find all files in this directory
while (my $file = readdir($DIR)) {
## Reset the counter
my $c=0;
## Skip any files that aren't .tex
next unless $file =~ /\.tex$/;
## Open the file
open(my $fh,"$path/$dir/$file");
while (<$fh>) {
## Get the subsection. $_ is the current line.
$sub="$_" and $n=0 if /\\subsection{/;
## If this line is a question
if (/\\begin{question}/) {
## If this counter is 0, this is the first file
## of this directory, so print the section
## Print the section name
if ($dd==0) {
print "\\section{$dir}\n\n";
$dd++;
}
## If this counter is 0, this is the first question
## of this subsection, so print the subsection line
print "$sub\n" if $n==0;
$n++;
## Increment the counter, we want these lines
$c++;
## And print
print;
}
else {
## Print lines if the counter is 1
print if $c==1;
## reset the counter to 0
print "\n" and $c=0 if /\\end{question}/;
}
}
print "\n";
}
}
Обратите внимание, что это игнорирует подразделы, но было бы легко изменить его, чтобы включить их.
-121--87759-Никто, кажется, не объясняет, почему вы используете каждый из них, учитывая ваши реальные примеры. Я сделаю удар:
killall Finder; killall SystemUIServer
Команда типа killall
может занять некоторое время. Используя точку с запятой, вы можете дать обе команды одновременно, а затем сделать что-то еще, пока вы ждете. Таким образом, вам не придется ждать дважды (по одному разу для каждой команды).
cd ~/Desktop/ && rm Caches
Вы хотите удалить каталог ~/Desktop/Caches
и оказаться в каталоге ~/Desktop
. То, что вы не хотите делать, это удалить каталог Кэш из текущего каталога (перед его изменением). Таким образом, перед выполнением команды remove необходимо с помощью &
проверить, успешно ли выполнено изменение каталога.
man grep | man cat
Для меня это бессмысленно. Команда man
не обрабатывает входные данные, поэтому передача данных в нее ничего не делает. Возможно, вы имели в виду
man grep || man cat
Что бы попытаться найти человека страницу для grep
, а затем, если бы он не мог, показал бы человека страницу для cat
. Или, возможно, вы имели в виду
man grep | cat
, что используйте cat
для отображения страницы человека, а не пейджера (обычно меньше
). |
перенаправляет выходные данные с man
на команду cat
(которая просто сбрасывает все на экран). Это может быть полезно в графическом интерфейсе пользователя, где можно использовать полосу прокрутки для перехода назад и вперед в файле, а не использовать команды клавиатуры в меньшем количестве.
Примечание: если вы хотите знать, что ;
& &
|
| |
делать в более общих случаях, я бы предложил посмотреть на ответ jimmij. Я просто пытаюсь объяснить, что происходит на примерах из вопроса.