MASALAH: memberi tag pada file, di bagian atas file, dengan nama dasar direktori induk.
Yaitu, untuk
/mnt/Vancouver/Programming/file1
tandai bagian atas file1
dengan Programming
.
SOLUSI 1 - file tidak kosong:
bn=${PWD##*/} ## bn: basename
sed -i '1s/^/'"$bn"'\n/' <file>
1s
menempatkan teks pada baris 1 file.
SOLUSI 2 - file kosong atau tidak kosong:
The sed
perintah, atas, gagal pada file kosong. Berikut ini solusinya, berdasarkan /superuser/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>
Perhatikan bahwa perintah -
di dalam cat diperlukan (baca input standar: lihat man cat
untuk informasi lebih lanjut). Di sini, saya percaya, diperlukan untuk mengambil output dari pernyataan printf (ke STDIN), dan cat itu dan file untuk temp ... Lihat juga penjelasan di bagian bawah http://www.linfo.org/cat .html .
Saya juga menambahkan -f
ke mv
perintah, untuk menghindari dimintai konfirmasi ketika menimpa file.
Untuk berulang pada direktori:
for file in *; do printf "${PWD##*/}\n" | cat - $file > temp && mv -f temp $file; done
Perhatikan juga bahwa ini akan memecah jalur dengan spasi; ada solusi, di tempat lain (misalnya file globbing, atau find . -type f ...
-type solusi) untuk itu.
ADDENDUM: Re: komentar terakhir saya, skrip ini akan memungkinkan Anda untuk melihat kembali direktori dengan spasi di jalur:
#!/bin/bash
## /programming/4638874/how-to-loop-through-a-directory-recursively-to-delete-files-with-certain-extensi
## 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/"
# /superuser/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
sed
.