Найдите файлы, базовые имена которых являются тем же, но их имена расширения не

Более или менее тот же ответ как Flup ;)

export CFLAGS="-I$HOME/include"
make

Если Вы заканчиваете тем, что нуждались к библиотекам ссылок в Вашем корневом каталоге:

export CFLAGS="-I$HOME/include -L$HOME/lib"

Однако, если Вы сделаете это, то Вам также будет нужно:

export LD_LIBRARY_PATH=$HOME/lib

при выполнении исполняемого файла, Вы делаете.

6
14.11.2014, 02:21
6 ответов

Решение с использованием (Я избегаю разборки 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 . или любой каталог, который вы хотели бы;)

4
27.01.2020, 20:21
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
1
27.01.2020, 20:21

Поскольку только ответы здесь либо использовать 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
3
27.01.2020, 20:21

Это происходит, когда 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

Если имена файлов содержат новые строки, это приведет к сбою.

1
27.01.2020, 20:21

Если вы хотите, чтобы все уникальные имена имена, здесь вы идете:

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\>"
7
27.01.2020, 20:21

Если у вас есть среда 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 ).

2
27.01.2020, 20:21

Теги

Похожие вопросы