Bash 在所有子目录中递归运行命令
我有一个文件夹,其中包含多达3层的子目录,图像位于最深的子目录中(对于大多数图像,这只是一个级别)。我想重命名这些图像,以包含它们所在目录的名称作为前缀。为此,我需要能够为子目录树中的每个子目录运行单个命令。 这是我的尝试:Bash 在所有子目录中递归运行命令,bash,Bash,我有一个文件夹,其中包含多达3层的子目录,图像位于最深的子目录中(对于大多数图像,这只是一个级别)。我想重命名这些图像,以包含它们所在目录的名称作为前缀。为此,我需要能够为子目录树中的每个子目录运行单个命令。 这是我的尝试: DIRS=/home/arjung2/data_256_nodir/a/* for dir in $DIRS do for f in $dir do echo "$dir" echo "$f" echo "
DIRS=/home/arjung2/data_256_nodir/a/*
for dir in $DIRS
do
for f in $dir
do
echo "$dir"
echo "$f"
echo "$dir_$f"
mv "$f" "$dir_$f"
done
done
但是,前三个echo
s为每个1级深子目录打印出相同的内容(并非如我所希望的那样全部打印到3级深子目录),并给出一个错误。示例输出如下所示:
/home/arjung2/data_256_nodir/a/airfield
/home/arjung2/data_256_nodir/a/airfield
/home/arjung2/data_256_nodir/a/airfield
mv: cannot move ‘/home/arjung2/data_256_nodir/a/airfield’ to a subdirectory of itself, ‘/home/arjung2/data_256_nodir/a/airfield/airfield’
知道我做错了什么吗?任何帮助都将不胜感激,谢谢 假设
dir
具有值/home/arjung2/data\u 256\u nodir/a/airfield
。在本例中,语句
for f in $dir
扩展到
for f in /home/arjung2/data_256_nodir/a/airfield
这意味着内部循环将只执行一次,f
取名称/home/arjung2/data\u 256\u nodir/a/airfield
,与dir
相同
对目录中的文件进行迭代更有意义:
for f in $dir/*
假设
dir
的值为/home/arjung2/data\u 256\u nodir/a/airfield
。在本例中,语句
for f in $dir
扩展到
for f in /home/arjung2/data_256_nodir/a/airfield
这意味着内部循环将只执行一次,f
取名称/home/arjung2/data\u 256\u nodir/a/airfield
,与dir
相同
对目录中的文件进行迭代更有意义:
for f in $dir/*
假设所有图像可以用“查找”(例如,后缀)来标识,请考虑下面的BASH脚本:
#! /bin/bash
find . -type f -name '*.jpeg' -print0 | while read -d '' file ; do
d=${file%/*};
d1=${d##*/};
new_file="$d/${d1}_${file##*/}"
echo "Move: $file -> $new_file"
mv "$file" "$new_file"
done
它会将每个文件夹/文件的a/b/c.jpeg移到a/b/b_c.jpeg。根据需要调整(或删除)名称。< /P> < P>假设所有图像都可以用“查找”(例如,后缀)标识,请考虑下面的BASH脚本:
#! /bin/bash
find . -type f -name '*.jpeg' -print0 | while read -d '' file ; do
d=${file%/*};
d1=${d##*/};
new_file="$d/${d1}_${file##*/}"
echo "Move: $file -> $new_file"
mv "$file" "$new_file"
done
它会将每个文件夹/文件的a/b/c.jpeg移到a/b/b_c.jpeg。根据需要调整(或删除)名称。应该是什么
$dir\uU$f
?是否设置了变量dir\uu
?或者这是一个打字错误,你想写${dir}\u$f
?应该是什么$dir\u$f
?是否设置了变量dir\uu
?或者这是一个打字错误,你想写${dir}u$f
?但是$f
的值将是一个相对路径,你不能将它用作mv
的目标(除非path/to/f
恰好包含目录path/to/f/path/to
)当然,移动的目的地也需要确定。我只想关注第一个bug,即为什么前两个变量的内容相同。对于Inasence,$dir\uU$f
没有意义(正如KamilCuk在评论中已经指出的),因为没有名为dir\uUcode>的变量。但是$f
的值将是一个相对路径,不能用作mv
的目标(除非path/to/f
恰好包含目录path/to/f/path/to
)当然,移动的目标目录也需要修复。我只想关注第一个错误,即为什么前两个变量具有相同的内容。对于疯狂来说,$dir\uf
没有意义(正如KamilCuk在评论中已经指出的),因为没有名为dir\uu
的变量。print0非常棒,但是不要忘记在read命令中包含“-r”。通常,您还应该执行mv--“$file”$new\u file但是这可以忽略不计,因为find表示总是以开头。/print0非常好,但是不要忘记在read命令中包含“-r”。通常,您也应该执行mv--“$file”$new_file”,但这可以忽略不计,因为find表示总是以开头/