ПРОБЛЕМА: пометьте файл в верхней части файла базовым именем родительского каталога.
т.е., для
/mnt/Vancouver/Programming/file1
пометьте верхнюю часть file1
с помощью Programming
.
РЕШЕНИЕ 1 - непустые файлы:
bn=${PWD##*/} ## bn: basename
sed -i '1s/^/'"$bn"'\n/' <file>
1s
помещает текст в строку 1 файла.
РЕШЕНИЕ 2 - пустые или непустые файлы:
Команда sed
выше не работает с пустыми файлами. Вот решение, основанное на https://superuser.com/questions/246837/how-do-i-add-text-to-the-beginning-of-a-file-in-bash/246841#246841
printf "${PWD##*/}\n" | cat - <file> > temp && mv -f temp <file>
Обратите внимание, что -
в команде cat требуется (читает стандартный ввод: см. man cat
для получения дополнительной информации). Здесь, я полагаю, необходимо взять выходные данные оператора printf (в STDIN), а затем переписать его и файл в temp ... См. Также пояснение внизу http://www.linfo.org/cat.html.
Я также добавил -f
к команде mv
, чтобы не запрашивать подтверждения при перезаписи файлов.
Для поиска по каталогу:
for file in *; do printf "${PWD##*/}\n" | cat - $file > temp && mv -f temp $file; done
Обратите внимание, что это будет разбивать пути с пробелами; есть решения, в другом месте (например, глобализация файлов или решения типа find . -type f ...
) для них.
ADDENDUM: Re: мой последний комментарий, этот скрипт позволит вам просматривать каталоги с пробелами в путях:
#!/bin/bash
## /2996039/kak-rekursivno-perebrat-katalog-chtoby-udalit-faily-s-opredelennymi-rasshireniyami
## To allow spaces in filenames,
## at the top of the script include: IFS=$'\n'; set -f
## at the end of the script include: unset IFS; set +f
IFS=$'\n'; set -f
# ----------------------------------------------------------------------------
# SET PATHS:
IN="/mnt/Vancouver/Programming/data/claws-test/corpus test/"
# https://superuser.com/questions/716001/how-can-i-get-files-with-numeric-names-using-ls-command
# FILES=$(find $IN -type f -regex ".*/[0-9]*") ## recursive; numeric filenames only
FILES=$(find $IN -type f -regex ".*/[0-9 ]*") ## recursive; numeric filenames only (may include spaces)
# echo '$FILES:' ## single-quoted, (literally) prints: $FILES:
# echo "$FILES" ## double-quoted, prints path/, filename (one per line)
# ----------------------------------------------------------------------------
# MAIN LOOP:
for f in $FILES
do
# Tag top of file with basename of current dir:
printf "[top] Tag: ${PWD##*/}\n\n" | cat - $f > temp && mv -f temp $f
# Tag bottom of file with basename of current dir:
printf "\n[bottom] Tag: ${PWD##*/}\n" >> $f
done
unset IFS; set +f