Ваша команда расширяется до этого:
export VIDEOS=mp4 VIDEOS=wmv VIDEOS=avi VIDEOS=flv VIDEOS=mkv VIDEOS=m4u VIDEOS=mpg VIDEOS=mpeg
Выполните это для наблюдения то, что происходит:
echo export VIDEOS={mp4,wmv,avi,flv,mkv,m4u,mpg,mpeg}
(это назвало расширение фигурной скобки),
Вторая проблема - это bash
действительно заключает в фигурные скобки расширение перед расширением параметра, не после него, таким образом, что-либо, что похоже на Ваше решение, будет грязно.
Необходимо было бы сделать что-то вроде этого:
eval echo \*.$VIDEOS
который станет раздражающим для ввода каждый раз.
Как насчет чего-то вроде этого:
videos() {
find . -mindepth 1 -maxdepth 1 -type f \
\( -name "*.mp4" -o -name "*.wmv" -o -name "*.avi" -o \
-name "*.flv" -o -name "*.mkv" -o -name "*.m4u" -o \
-name "*.mpg" -o -name "*.mpeg" \)
}
Затем вместо выполнения:
ls *.$VIDEOS
просто сделайте это:
videos
или если необходимо передать его команде:
ls $(videos)
Эта работа части:
echo *.{mp4,wmv,avi,flv,mkv,m4u,mpg,mpeg}
мог быть ключ к разгадке .bash_profile
не работа. Например, это могло бы означать, что Вы используете zsh
.
Скажите нам, что это делает:
echo $0
таким образом, мы можем выяснить, какой файл необходимо вставить его.
Если порядок не имеет значения (т.е. просто исключает все электронные письма с md5 в исключить файле), и Вы не связаны узами брака с awk, используете join
:
join -v 1 -j 1 <(sort emails) <(sort excludes)
-v 1
говорит этому печатать строки в первом файле (электронные письма), которые не имеют соответствующей строки во втором файле (исключает).
-j 1
говорит этому только смотреть на первый столбец каждого.
Если Вы хотите использовать awk, я полагаю, что это должно работать:
awk 'NF==1{exclude[$1]++} NF==2&&!exclude[$1]' excludes emails
Или если эти два файла соответствуют линию за линией, и Вы только хотите исключить, например, выровнять 2, если у обоих есть тот же хеш на той конкретной строке, используйте это:
awk 'NF==1{hash[FNR]=$1} NF==2&&hash[FNR]!=$1' excludes emails
Это обладает преимуществом, что файлы могут войти в любой порядок:
sort file1 file2 | uniq -u --check-chars 32 | grep -E '.{33}'
sort file1 file2
комбинирует и сортирует файлы при подготовке к uniq.
uniq -u --check-chars 32
рассматривает только первые 32 символа, и с -u
, печать только уникальные строки.
grep -E '.{33}'
печать только строки, содержащие 33 или больше символа.
Править
Как Peter. O указывает, это не обрабатывает случай, где две или больше записи в списке файлов имеют тот же md5. В этом случае те файлы не будут распечатаны. Мне нравится join
решение лучшее.
Однако эта логика зависит от всех отдельных файлов, имеющих уникальный md5, который является плохим предположением в зависимости от использования этого вывода. Вот пример резервного сценария с помощью md5sum логики. Хотя join
логика правильно определяет и fileA и fileB (в отличие от моего решения), существует все еще проблема:
echo "hello world" > fileA
cp fileA fileB
./backup_script.sh
cp fileA fileC
./backup_script.sh
op indend fileC, который будет сохранен?
Эта команда должна работать:
awk '
NR==FNR {
a[$1]=$0;
next
}
{ if ( a[$1] ) delete a[$1] }
END {
for ( md5 in a ) {
if ( a[md5] ) { print a[md5] }
}
}
' file1 file2
FNL
предназначен, чтобы бытьFNR
. Я предполагаю, "шел тяжело", означает "не для того, чтобы". Здесь, в Австралии, "для хождения тяжело" означает "подниматься неожиданно (человек)", таким образом выясняя как это иFNL
были связаны было "интересно"... (+1) для хорошего ответа... – Peter.O 25.02.2012, 07:45FNR
; "высоко подброшенный" была входная ошибка на планшете, который я использовал. Я перефразировал его и протестировал теперь. – Kevin 25.02.2012, 08:13