Более или менее тот же ответ как Flup ;)
export CFLAGS="-I$HOME/include"
make
Если Вы заканчиваете тем, что нуждались к библиотекам ссылок в Вашем корневом каталоге:
export CFLAGS="-I$HOME/include -L$HOME/lib"
Однако, если Вы сделаете это, то Вам также будет нужно:
export LD_LIBRARY_PATH=$HOME/lib
при выполнении исполняемого файла, Вы делаете.
Решение с использованием Perl (Я избегаю разборки LS
вывод, он не предназначен для этой задачи и может вызвать ошибки):
perl -E '
while (<*>){
($full, $short) = (m/^((.*?)\..*)$/);
next unless $short;
push @{ $h->{$short} }, $full;
}
for $key (keys %$h) {
say join " ", @{ $h->{$key} } if @{ $h->{$key} } > 1;
}
' /home/sputnick
заменить / Home / Sputnick
.
или любой каталог, который вы хотели бы;)
ls -1 | awk -F'.' '{print $1}'|uniq -cd
awk печатает первое поле ( $ 1
) каждого файлов с .
полевой сепаратор.
UNIQ -D
дает только дубликаты строк, а с параметром -C
напечатайте количество вхождений.
$ ls -1
0001.jpg
0001.tar.gz
0001.tiff
0002.png
0002.tar.bz2
001.zip
$ ls -1 | awk -F'.' '{print $1}'|uniq -cd 3 0001 2 0002
Поскольку только ответы здесь либо использовать SED
или PERL
и регулярные выражения, я думал, что быть разными и пост-то спорным проще.
for file in /path/to/your/files/*; do echo ${file%%.*}; done | uniq -d
В этом примере $ {file %%. *}
соответствует пути к файлу до первого периода (.
). Так, 0001.tar.gz
будет рассматриваться как 0001
.
Вывод будет выглядеть так
/path/to/your/files/0001
/path/to/your/files/0002
, если вы не хотите полный путь в выходе, просто CD
сначала в каталоге, а затем запустите команду с помощью Asterisk ( *
) для пути.
cd /path/to/your/files
for file in *; do echo ${file%%.*}; done | uniq -d
Тогда выход будет выглядеть так
0001
0002
Это происходит, когда TERM
не набор к правильному экрану [-256color]
в среде Vim, обычно с помощью сценария запуска оболочки. Если это так - например, у вас есть
TERM=xterm-256color
, либо удалите его, либо убедитесь, что оно проверяет исходное значение TERM
перед его изменением, например,
if [[ $TERM == xterm ]]; then
TERM=xterm-256color
fi
-121--35249- Если вам нужны все уникальные имена файлов, перейдите по ссылке:
ls -1 | sed 's/\([^.]*\).*/\1/' | uniq
Если требуется, чтобы несколько файлов имели одинаковое базовое имя, используйте:
ls -1 | sed 's/\([^.]*\).*/\1/' | uniq -c | sort -n | egrep -v "^ *\<1\>"
Для имен файлов с несколькими точками используйте следующее:
ls -1 | sed 's/\(.*\)\..*/\1/' | uniq -c | sort -n | egrep -v "^ *\<1\>"
-121--58413- Если вы не боитесь выполнить синтаксический анализ ls
:
/bin/ls --color=no -1 | sed 's/\.[^.]*$//' | uniq -d
Если имена файлов содержат новые строки, это приведет к сбою.
Если вы хотите, чтобы все уникальные имена имена, здесь вы идете:
ls -1 | sed 's/\([^.]*\).*/\1/' | uniq
Если вы хотите, чтобы файлы такие, что более одного из них имеют одинаковое базенное значение, то используйте:
ls -1 | sed 's/\([^.]*\).*/\1/' | uniq -c | sort -n | egrep -v "^ *\<1\>"
для имена файлов С несколькими периодами используйте следующее:
ls -1 | sed 's/\(.*\)\..*/\1/' | uniq -c | sort -n | egrep -v "^ *\<1\>"
Если у вас есть среда GNU, вот решение Rombust , которое печатает общие базовые имена, Использование GAWK
(просто для смешивания):
find . -maxdepth 1 -type f -printf "%f\0" |
gawk 'BEGIN{RS="\0"} {sub(/\.[^.]+$/,""); if (length($0))printf("%s\0",$0)}' |
sort -z | uniq -zd |
tr '\000' '\n'
Это использует Найти
с \ 0 (Nul) разграниченными именами файлов, Gawk
с RS
(Рекордный сепаратор) Установите на \ 0, чтобы соответствовать входу и A Sub (/ Regex /)
, чтобы разделить расширение.
Команда TR
отменяет разграничение Nul для печати на экран, опустите это для дальнейшей (безопасной) обработки имена файлов .
(Обычно я бы сделал что-то вроде , что бы ни было | Rev | Cut -D. -F2- | Rev | Сортировка
, но Rev
не делает Nul-delimited вход.
Если вы хотите ограничить его только файлами с помощью .ext
или более конкретным шаблоном, вы можете использовать:
find . -maxdepth 1 -type f -name "*.*" -printf "%f\0" | ...
Первая опция выше только печатает общую базу, если вы хотите распечатать Фактические имена файлов:
find . -maxdepth 1 -type f -name "*.*" -printf "%f\0" |
gawk 'BEGIN{ RS="\0" }
{ base=$0;sub(/\.[^.]+$/,"",base);seen[base][FNR]=$0}
END { for (bb in seen)
if (length(seen[bb])>1)
for (ff in seen[bb]) printf("%s\0",seen[bb][ff])
}' |
tr '\000' '\n'
(минимум GAWK V4.0, необходимый для многомерных массивов!)
Это использует массив (HASH) [] []
, чтобы кэш виден имена файлов, выявленные в базовом имени, Затем в конце его итерации на основе базовых имен в видны [BB]
и распечатывают те, которые с более чем совпадают ( длиной (видно [BB])> 1
).