获取find命令扩展参数的第一个字符

获取find命令扩展参数的第一个字符

我有大量图像,我想将它们放入与前 3 个字符+.jpg 扩展名匹配的文件夹中。

所以我想抓取4_1_0002.png文件(以 4_1 开头的所有文件)并将其放入4_1_.jpg文件夹中。同样,我想抓取4_2_0002.png文件(以 4_2 开头的所有文件)并将其放入4_2_.jpg文件夹中。

我想要排序的所有这些文件现在都在一个巨大的文件夹中。我期望使用 find 命令,但我不知道如何从 {} 扩展参数中提取前三个字符。

find . -type f -ok echo mv {} "path/first3char.jpg" \;

在此输入图像描述

在此输入图像描述

答案1

有些工具可以使重命名文件变得更加容易。例如,使用任何 Perlrename实现,通常可以使用以下名称prename

prename '$dir = substr($_,0,3); mkdir $dir; $_ = "$dir/$_"' *.jpg

如果目录已经存在,您可以将其简化为

prename 's!(...)!$1/$1!' *.jpg

prename例如,如果您的发行版不包含,请安装一个Unicode::争斗或者文件::重命名

find在这里可能没有用,因为文件都在同一目录中。但是,您可能会遇到错误,因为命令行太长。find是解决这个问题的一种方法;您可以使用

find -maxdepth 1 -name '*.jpg' -exec prename 's!(...)!$1/$1!' {} +

或者,运行桀骜而不是 bash,并利用它的优势zmv功能

autoload zmv        # you can put this in ~/.zshrc
mkdir_mv () {
  mkdir -p -- $2:h
  mv -- $1 $2
}
zmv -p mkdir_mv '(???)*.jpg' '$1/$f'

如果目录已经存在,则可以仅使用

zmv '(???)*.jpg' '$1/$f'

答案2

src="/pathto/large_folder"
dest="/tmp/3chars"

mkdir -p "$dest" || exit 1

cd "$src" && \
find . -type f -name '???*' -exec sh -c '
   for f
   do
      b=${f##*/}
      d=${b%"${b#???}"}_.jpg
      [ -d "$dest/$d" ] || mkdir -p "$dest/$d"
      mv "$f" "$dest/$d/."
   done
' x {} +

相关内容