Tú pediste sed,pero ed
también puede hacer esto:
$ seq 10 > input
$ ed -s input <<< '/5/ -2, /5/ +2 d'$'\n'w
$ cat input
1
2
8
9
10
Esto le dice a ed que s
edite silenciosamente el archivo input
con dos comandos:
5
, menos dos líneas y terminando en la línea que coincide con la expresión regular 5
, más dos líneas, d
elimine ese rango (separados con un ANSI -salto de línea escapado$'\n'
)
w
grabe el archivo de nuevo en el disco Предполагая, что мы знаем, что все файлы имеют суффикс имени файла .html
или .txt
и что все каталоги имеют суффикс .directory
, вы можете использовать:
for i in *.txt *.html
do
mv "$i" "${i%%.*}.directory/$i"
done
Запустите это в том же каталоге, где у вас есть файлы. Он удалит конечные.txt и.html из имен файлов, а затем переместит файлы в каталог назначения.
dirs=$(ls | grep ".d")
for d in $dirs
do
filename=$(echo $d | awk -F"." '{print $1}')
ls | grep -P "$filename.(?!(d))" | xargs -I{} mv '{}' '$d'
done
Возможно, слишком многословно, но работает
Предполагая, что имена файлов и каталогов следуют одному и тому же соглашению об именах в том смысле, что они имеют общий префикс группировки, за которым следует точка, и предполагая, что мы не знаем суффиксов имен файлов или каталогов:
topdir=.
for dirname in "$topdir"/*/; do
prefix=$( basename "$dirname" ) # $topdir/FileC.directory/ --> FileC.directory
prefix=${prefix%%.*} # FileC.directory --> FileC
for filename in "$topdir/$prefix".*; do
if [ ! -d "$filename" ]; then
mv -i "$filename" "$dirname"
fi
done
done
Внешний цикл перебирает все каталоги в каталоге $topdir
(, здесь установленном на .
, текущем каталоге ). $prefix
будет базовым именем имени каталога с удаленным битом после первой точки.
После того, как префикс был вычислен, файлы )не из -каталогов (в том же каталоге $topdir
, которые имеют один и тот же префикс, перемещаются в каталог.