Bash 在所有子目录中递归运行命令

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 "

我有一个文件夹,其中包含多达3层的子目录,图像位于最深的子目录中(对于大多数图像,这只是一个级别)。我想重命名这些图像,以包含它们所在目录的名称作为前缀。为此,我需要能够为子目录树中的每个子目录运行单个命令。 这是我的尝试:

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表示总是以开头/