Как смолить n новые файлы с пробелами в имени файла?

Я пытаюсь создать сценарий что 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 
3
задан 7 April 2014 в 06:28

4 ответа

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 на любого другого, даже очень высокое количество, и он будет все еще работать, не получая слишком длинный список аргументов.

6
ответ дан 17 November 2019 в 19:19
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
1
ответ дан 17 November 2019 в 19:19

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 '..';
    }
}
1
ответ дан 17 November 2019 в 19:19

Можно попробовать:

#!/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 
1
ответ дан 17 November 2019 в 19:19

Другие вопросы по тегам:

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