我正在尝试创建一个将运行下面的bash脚本的AppleScript。将名为temp_m的任何文件移动到具有匹配名称的文件夹。屏幕截图仅供参考。 AppleScript的好处是用户可以轻松选择“松散图像”(源)文件夹和构建(存档)文件夹。它们通常存在于不同的位置,有时位于服务器/共享位置。
E.G。来自
到
set myFolder to (choose folder)
set pFolder to POSIX path of myFolder
set folderNames to paragraphs of (do shell script "
PARENTDIRECTORY="pFolder"
find . -name "*.jpg" | while read file
do
temp_m=$(basename "$file" .jpg)
look=$(echo "$PARENTDIRECTORY/*/*${temp_m}" | sed 's/ /\\ /g') #I need to match all subfolders in this parent folder that have the same name as temp_m name
look=$(eval echo $look)
if [ -f "$look" ]
then
todir="${look%/*}"
echo mv "${temp_m}.jpg" ${todir}/ # echo action to perform - after testing remove echo
else
echo "No unique match for $file ($look)"
fi
done
答案 0 :(得分:1)
你可能只是使用这样的shell命令:
shopt -s nullglob;for f in ~/Pictures/loose\ files/*.jpg;do f2=${f##*/};d=~/Pictures/*/*/*/*/${f2%_*};[[ $d ]]&&echo mv "$f" $d;done
shopt -s nullglob
使与任何文件不匹配的文件名模式扩展为空字符串。 ${f##*/}
从*/
开始删除最长的f
模式,${f2%_*}
从_*
的末尾删除最短的f2
模式。 [[ $d ]]
相当于[[ -n $d ]]
,或者测试$d
是否已设置且未设置为空字符串。
如果目标文件夹可以处于不同的嵌套级别,则可以使用find
:
for f in ~/Pictures/loose\ files/*.jpg;do f2=${f##*/};d=$(find ~/Pictures -type d -name ${f2%_*});[[ $d ]]&&echo mv "$f" $d;done
答案 1 :(得分:0)
您的bash代码有几个问题;这是一个已清理的版本,它会根据您的描述和屏幕截图尝试我认为您正在尝试做的事情:
# Set the source and target [root] dir as POSIX paths.
# Do NOT quote spaces here - this will be done below - but
# note that, if applicable, you must use the explicit home-directory
# path rather than '~'.
tell application "System Events"
set SOURCEDIRECTORY to "."
# Example: Set to ~/Pictures/Archive
set PARENTDIRECTORY to POSIX path of home folder & "/Pictures/Archive"
end tell
# Set the level in the target subdirectory hierarchy at which the
# specific target directories are located.
set SUBDIRLEVEL to 4
do shell script "
SUBDIRLEVEL=" & SUBDIRLEVEL & "
SOURCEDIRECTORY=" & quoted form of SOURCEDIRECTORY & "
PARENTDIRECTORY=" & quoted form of PARENTDIRECTORY & "
find \"$SOURCEDIRECTORY\" -type f -name \"*.jpg\" | while read file; do
# Determine the subdir name prefix - everything before
# the first \"_\" - with the extension stripped in any event.
temp_m=$(cut -d '_' -f 1 <<<\"$(basename \"$file\" .jpg)\")
# At the specified subdir level, find subdirs. of \"$PARENTDIRECTORY\"
# whose name matches the prefix.
matches=$(find \"$PARENTDIRECTORY\" \\
-mindepth $SUBDIRLEVEL -maxdepth $SUBDIRLEVEL \\
-type d -name \"${temp_m}\")
# Expected: exactly 1 match.
# Note: As long as only 1 level of subdirs is matched, there is
# no strict need to test for *more* than 1 match.
if [[ -n $matches && $(wc -l <<<\"$matches\") -eq 1 ]]; then
todir=$matches
# echo action to perform - after testing, remove echo
echo mv \"$file\" \"${todir}/\"
else
echo \"No unique match for $file ($temp_m)\"
fi
done
"
注意:
set folderNames to paragraphs of
之前的do shell script
没有意义。-mindepth $SUBDIRLEVEL -maxdepth $SUBDIRLEVEL
选项(删除它们将搜索所有级别)。