Linux: Переместите 1 миллион файлов в основанные на префиксе созданные Папки

я хотел бы сделать это, не присоединяя класс к каждому td

Лично, я пойду с подход class-on-each-td/th/col. Тогда можно включить столбцы и от использования единственной записи к имени класса на контейнере, приняв правила стиля как:

table.hide1 .col1 { display: none; }
table.hide2 .col2 { display: none; }
...

Это будет быстрее, чем какой-либо подход цикла JS; для действительно длинных таблиц это может иметь значительное значение к скорости отклика.

, Если можно сойти с рук не поддержка IE6, Вы могли бы использовать селекторы смежности, чтобы избежать необходимости добавлять, что класс приписывает tds. Или альтернативно, если Ваше беспокойство делает инструмент для очистки разметки, Вы могли бы добавить их от JavaScript автоматически на шаге инициализации.

6
задан derobert 7 August 2009 в 03:13
поделиться

5 ответов

for i in *.*; do mkdir -p ${i:0:1}/${i:1:1}/${i:2:1}/; mv $i ${i:0:1}/${i:1:1}/${i:2:1}/; done;

$ {i: 0: 1} / $ {i: 1: 1 } / $ {i: 2: 1} , вероятно, может быть переменной, короче или отличаться, но приведенная выше команда выполняет свою работу. Вы, вероятно, столкнетесь с проблемами производительности, но если вы действительно хотите его использовать, сузьте *.

7
ответ дан 9 December 2019 в 20:47
поделиться

Вы можете сгенерировать новое имя файла, используя, например, sed:

$ echo "test.jpg" | sed -e 's/^\(\(.\)\(.\)\(.\).*\)$/\2\/\3\/\4\/\1/'
t/e/s/test.jpg

Итак, вы можете сделать что-то вроде этого (при условии, что все каталоги уже созданы):

for f in *; do
   mv -i "$f" "$(echo "$f" | sed -e 's/^\(\(.\)\(.\)\(.\).*\)$/\2\/\3\/\4\/\1/')"
done

или, если вы не можете использовать синтаксис bash $ (:

for f in *; do
   mv -i "$f" "`echo "$f" | sed -e 's/^\(\(.\)\(.\)\(.\).*\)$/\2\/\3\/\4\/\1/'`"
done

Однако, учитывая количество файлов, вы можете просто захотеть использовать perl, так как возникает много процессов sed и mv:

#!/usr/bin/perl -w
use strict;

# warning: untested
opendir DIR, "." or die "opendir: $!";
my @files = readdir(DIR); # can't change dir while reading: read in advance
closedir DIR;
foreach my $f (@files) {
    (my $new_name = $f) =~ s!^((.)(.)(.).*)$!$2/$3/$4/$1/;
    -e $new_name and die "$new_name already exists";
    rename($f, $new_name);
}

Этот perl, безусловно, ограничен только той же файловой системой, хотя вы можете использовать File :: Copy :: move , чтобы обойти это.

2
ответ дан 9 December 2019 в 20:47
поделиться

Вы можете сделать это как сценарий bash:

#!/bin/bash

base=base

mkdir -p $base/shorts

for n in *
do
    if [ ${#n} -lt 3 ]
    then
        mv $n $base/shorts
    else
        dir=$base/${n:0:1}/${n:1:1}/${n:2:1}
        mkdir -p $dir
        mv $n $dir
    fi
done

Излишне говорить, что вам, возможно, придется беспокоиться о пробелах и файлах с короткими именами.

2
ответ дан 9 December 2019 в 20:47
поделиться

Я предлагаю короткий скрипт на Python. Большинство инструментов оболочки не хотят вводить такой объем (хотя xargs может помочь). Через секунду будет обновлен пример.

#!/usr/bin/python
import os, shutil

src_dir = '/src/dir'
dest_dir = '/dest/dir'

for fn in os.listdir(src_dir):
  os.makedirs(dest_dir+'/'+fn[0]+'/'+fn[1]+'/'+fn[2]+'/')
  shutil.copyfile(src_dir+'/'+fn, dest_dir+'/'+fn[0]+'/'+fn[1]+'/'+fn[2]+'/'+fn)
1
ответ дан 9 December 2019 в 20:47
поделиться

Любое из предложенных решений, использующих синтаксис подстановочных знаков в оболочке, скорее всего, не сработает из-за большого количества файлов, которые у вас есть. Из предлагаемых в настоящее время решений, perl, вероятно, является лучшим.

Однако вы можете легко адаптировать любой из методов сценария оболочки для работы с любым количеством файлов, например:

ls -1 | \
while read filename
do
  # insert the loop body of your preference here, operating on "filename"
done

Я бы все равно использовал perl, но если вы ограничены наличием только простых инструментов unix, а затем объединение одного из вышеперечисленных решений оболочки с циклом, как я показал, должно привести вас к этому. Однако это будет медленно.

0
ответ дан 9 December 2019 в 20:47
поделиться
Другие вопросы по тегам:

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