Я пытаюсь создать сценарий что foreach directoy в folder
папка, только n
должны быть сжаты новые файлы.
Однако я испытываю затруднения из-за нескольких файлов слова. Мне нужен способ перенести их в метки кавычки так tar
команда знает, который является каждым файлом.
Вот мой сценарий до сих пор:
#!/bin/bash
if [ ! -d ~/backup ]; then
mkdir ~/backup
fi
cd ~/folder
for i in *; do
if [ -d "$i" ]; then
original=`pwd`
cd $i
echo tar zcf ~/backup/"$i".tar.gz "`ls -t | head -10`"
cd $original
fi
done
echo "Backup copied in $HOME/backup/"
exit 0
xargs
к спасению! Один путь состоит в том, чтобы использовать xargs, чтобы создать список аргументов, но вставить каждый файл кавычек:
echo `ls -t1 | head -10 | xargs -I'{}' echo \"{}\"`
Другая опция это для использования xargs
для прямого вызова tar
в добавляет режим (-r
) и затем сжатие его в конце (Вы не можете создать сжатые архивы в, добавляют режим):
ls -t | head -10 | xargs -I'{}' tar -rvf ~/backup/"$i".tar '{}'
gzip ~/backup/"$i".tar
преимущество 2-го подхода состоит в том, что можно измениться 10
на любого другого, даже очень высокое количество, и он будет все еще работать, не получая слишком длинный список аргументов.
n=3
shopt -s nullglob
for dir in */; do
cd "$dir"
files=(*)
if (( ${#files[@]} > 0 )); then
files=()
while IFS= read -r filename; do
files+=("$filename")
done < <( stat -c "%Y %n" * | sort -n | cut -d " " -f 2- | head -n $n )
tar cf ../"${dir%/}.tar" "${files[@]}"
fi
cd - &>/dev/null
done
Perl к спасению:
#!/usr/bin/perl
use warnings;
use strict;
my $backup = $ENV{HOME} . '/backup';
my $folder = $ENV{HOME} . '/folder';
-d $backup or mkdir $backup or die $!;
chdir $folder or die $!;
while (my $node = glob '*') {
if (-d $node) {
chdir $node;
my @files = sort { -M $a <=> -M $b } glob '*'; # Sort files by age.
@files = @files[0 .. 9] if @files > 10; # Keep only the newest 10.
system 'tar', 'zcf', "$backup/$node.tar.gz", @files;
chdir '..';
}
}
Можно попробовать:
#!/bin/bash
if [ ! -d $HOME/backup ]; then
mkdir $HOME/backup
fi
cd $HOME/folder
for i in *; do
if [ -d "$i" ]; then
tar -cf $HOME/backup/"$i".tar -T /dev/null #create an empty, uncompressed, archive
cd "$i"
ls -t | head -10 | while read file; do
tar -rf $HOME/backup/"$i".tar "$file" #append $file to archive
done
gzip $HOME/backup/"$i".tar # compress the archive
cd $OLDPWD
fi
done
echo "Backup copied in $HOME/backup/"
exit 0