я хотел бы сделать это, не присоединяя класс к каждому td
Лично, я пойду с подход class-on-each-td/th/col. Тогда можно включить столбцы и от использования единственной записи к имени класса на контейнере, приняв правила стиля как:
table.hide1 .col1 { display: none; }
table.hide2 .col2 { display: none; }
...
Это будет быстрее, чем какой-либо подход цикла JS; для действительно длинных таблиц это может иметь значительное значение к скорости отклика.
, Если можно сойти с рук не поддержка IE6, Вы могли бы использовать селекторы смежности, чтобы избежать необходимости добавлять, что класс приписывает tds. Или альтернативно, если Ваше беспокойство делает инструмент для очистки разметки, Вы могли бы добавить их от JavaScript автоматически на шаге инициализации.
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}
, вероятно, может быть переменной, короче или отличаться, но приведенная выше команда выполняет свою работу. Вы, вероятно, столкнетесь с проблемами производительности, но если вы действительно хотите его использовать, сузьте *.
Вы можете сгенерировать новое имя файла, используя, например, 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
, чтобы обойти это.
Вы можете сделать это как сценарий 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
Излишне говорить, что вам, возможно, придется беспокоиться о пробелах и файлах с короткими именами.
Я предлагаю короткий скрипт на 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)
Любое из предложенных решений, использующих синтаксис подстановочных знаков в оболочке, скорее всего, не сработает из-за большого количества файлов, которые у вас есть. Из предлагаемых в настоящее время решений, perl, вероятно, является лучшим.
Однако вы можете легко адаптировать любой из методов сценария оболочки для работы с любым количеством файлов, например:
ls -1 | \
while read filename
do
# insert the loop body of your preference here, operating on "filename"
done
Я бы все равно использовал perl, но если вы ограничены наличием только простых инструментов unix, а затем объединение одного из вышеперечисленных решений оболочки с циклом, как я показал, должно привести вас к этому. Однако это будет медленно.